क्लोजर में कुछ प्रारंभिक एसआईसीपी कोड को लागू करते समय मुझे एक अप्रत्याशित NullPointerException का सामना करना पड़ा। विशेष रूप से, मैं धारा 1.1.7 से पुनरावर्तक वर्ग रूट प्रक्रिया को कार्यान्वित करना चाहता हूं।एसआईसीपी sqrt NullPointerException
(defn square [x] (* x x))
(defn abs [x]
(cond
(< x 0) (- x)
:else x))
(defn average [x y]
(/ (+ x y) 2))
(defn sqrt
([x] (sqrt 1.0 x))
([guess x]
(letfn [(good-enough? [guess]
(< (abs (- (square guess) x)) 0.001))
(improve [guess]
(average guess (/ x guess)))]
(if (good-enough? guess)
guess
(recur (improve guess) x)))))
इस छोटे से पर्याप्त मूल्यों, उदा ठीक काम करता है:
कोड यह (sqrt 16)
। मुझे (square 2718)
से बड़े किसी भी इनपुट के लिए NullPointerException clojure.lang.Numbers.lt (Numbers.java:3693)
त्रुटि मिलती है।
कोई विचार?
पूरे ट्रैस बैक के साथअद्यतन (पिछले एक सब मैं repl में मिलता है):
धागा "मुख्य" clojure.lang.Numbers.lt पर java.lang.NullPointerException में अपवाद (Numbers.java : 3693) 14.invoke ___ sicp_in_clojure.chapter_one $ sqrt $ good_enough_QMARK पर (chapter_one.clj: 40) sicp_in_clojure.chapter_one $ sqrt.invoke (chapter_one.clj पर: 43) sicp_in_clojure.chapter_one $ sqrt.invoke पर (chapter_one.clj : 37) sicp_in_clojure.chapter_one $ eval19.invoke (Chapter_one.clj: 48) clojure.lang.Compiler.eval (Compiler.java:6465) clojure.lang.C पर ompiler.load (compiler.java:6902) clojure.lang.Compiler.loadFile (compiler.java:6863) clojure.main $ load_script.invoke (main.clj: 282) clojure.main $ script_opt पर। clojure.main $ main.doInvoke (main.clj: 426) clojure.lang.RestFn.invoke (RestFn.java:408) clojure.lang.Var.invoke पर invoke (main.clj: 342) Var.java:401) clojure.lang.AFn.applyToHelper (AFn.java:161) clojure.lang.Var.applyTo (Var.java:5218) clojure.main.main पर (main.java: 37)
क्या आप पूरे ट्रेसबैक पेस्ट कर सकते हैं? – poolie
मैं त्रुटि को पुन: उत्पन्न नहीं कर सकता, यह मेरे लिए ठीक काम करता है, यहां तक कि बड़ी संख्या के लिए भी। क्लोजर/जावा के कौन से संस्करण आप काम कर रहे हैं? –
मैं भी पुन: उत्पन्न नहीं कर सकता - मुझे लगता है कि आपका वर्ग कार्य है (वर्ग [x] (* x x) defn)। अन्यथा कोड को कॉपी-पेस्ट किया गया। – Paul