Swing Clojure空指针异常
我试图写一个clojure代码,它生成一个图像,图像的每个像素的x和y坐标值为XOR,但是我得到了一个NullpointerException。我无法找出代码中的错误 这是我的密码:Swing Clojure空指针异常,swing,clojure,Swing,Clojure,我试图写一个clojure代码,它生成一个图像,图像的每个像素的x和y坐标值为XOR,但是我得到了一个NullpointerException。我无法找出代码中的错误 这是我的密码: (ns com.test (:import (javax.swing JFrame)) (:gen-class)) ; Each pixel has color value of xor of its x and y co-ordinates (defn generateXorList [limit]
(ns com.test
(:import (javax.swing JFrame))
(:gen-class))
; Each pixel has color value of xor of its x and y co-ordinates
(defn generateXorList [limit]
(for [x (range limit)
y (range limit)]
[x y (bit-xor x y)]
))
(defn makeImage [seq]
(let [frameSize 250
frame (JFrame.)
gfx (.getGraphics frame)]
(.setVisible frame true)
(.setSize frame frameSize frameSize)
(.setDefaultCloseOperation frame JFrame/EXIT_ON_CLOSE)
(doseq [[x y color] seq]
(.setColor gfx (java.awt.Color. color))
(.fillRect gfx x y 1 1)
)))
;; Generate the image
(makeImage (generateXorList 250))
这是stacktrace
clojure.lang.Compiler$CompilerException: java.lang.NullPointerException, compiling:(/tmp/t.clj:26:1)
at clojure.lang.Compiler.load (Compiler.java:7239)
user$eval1125.invoke (form-init5557027396137860263.clj:1)
clojure.lang.Compiler.eval (Compiler.java:6782)
clojure.lang.Compiler.eval (Compiler.java:6745)
clojure.core$eval.invoke (core.clj:3081)
clojure.main$repl$read_eval_print__7099$fn__7102.invoke (main.clj:240)
clojure.main$repl$read_eval_print__7099.invoke (main.clj:240)
clojure.main$repl$fn__7108.invoke (main.clj:258)
clojure.main$repl.doInvoke (main.clj:258)
clojure.lang.RestFn.invoke (RestFn.java:1523)
clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__623.invoke (interruptible_eval.clj:58)
clojure.lang.AFn.applyToHelper (AFn.java:152)
clojure.lang.AFn.applyTo (AFn.java:144)
clojure.core$apply.invoke (core.clj:630)
clojure.core$with_bindings_STAR_.doInvoke (core.clj:1868)
clojure.lang.RestFn.invoke (RestFn.java:425)
clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:56)
clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__665$fn__668.invoke (interruptible_eval.clj:191)
clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__660.invoke (interruptible_eval.clj:159)
clojure.lang.AFn.run (AFn.java:22)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:617)
java.lang.Thread.run (Thread.java:745)
Caused by: java.lang.NullPointerException: null
at com.test$makeImage.invoke (t.clj:22)
com.test$eval1171.invoke (t.clj:27)
clojure.lang.Compiler.eval (Compiler.java:6782)
clojure.lang.Compiler.load (Compiler.java:7227)
user$eval1125.invoke (form-init5557027396137860263.clj:1)
clojure.lang.Compiler.eval (Compiler.java:6782)
clojure.lang.Compiler.eval (Compiler.java:6745)
clojure.core$eval.invoke (core.clj:3081)
clojure.main$repl$read_eval_print__7099$fn__7102.invoke (main.clj:240)
clojure.main$repl$read_eval_print__7099.invoke (main.clj:240)
clojure.main$repl$fn__7108.invoke (main.clj:258)
clojure.main$repl.doInvoke (main.clj:258)
clojure.lang.RestFn.invoke (RestFn.java:1523)
clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__623.invoke (interruptible_eval.clj:58)
clojure.lang.AFn.applyToHelper (AFn.java:152)
clojure.lang.AFn.applyTo (AFn.java:144)
clojure.core$apply.invoke (core.clj:630)
clojure.core$with_bindings_STAR_.doInvoke (core.clj:1868)
clojure.lang.RestFn.invoke (RestFn.java:425)
clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:56)
clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__665$fn__668.invoke (interruptible_eval.clj:191)
clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__660.invoke (interruptible_eval.clj:159)
clojure.lang.AFn.run (AFn.java:22)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:617)
java.lang.Thread.run (Thread.java:745)
将返回null
,直到帧可见:
为此组件创建图形上下文。如果此组件当前不可显示,此方法将返回null
在调用(.getGraphics frame)
并将其分配给局部变量之前,必须先调用(.setVisible frame true)
(defn makeImage [seq]
(let [frameSize 250
frame (JFrame.)]
(.setVisible frame true)
(.setSize frame frameSize frameSize)
(.setDefaultCloseOperation frame JFrame/EXIT_ON_CLOSE)
(let [gfx (.getGraphics frame)]
(doseq [[x y color] seq]
(.setColor gfx (java.awt.Color. color))
(.fillRect gfx x y 1 1)))))
或使用以下方法设置框架:
将返回null
,直到帧可见:
为此组件创建图形上下文。如果此组件当前不可显示,此方法将返回null
在调用(.getGraphics frame)
并将其分配给局部变量之前,必须先调用(.setVisible frame true)
(defn makeImage [seq]
(let [frameSize 250
frame (JFrame.)]
(.setVisible frame true)
(.setSize frame frameSize frameSize)
(.setDefaultCloseOperation frame JFrame/EXIT_ON_CLOSE)
(let [gfx (.getGraphics frame)]
(doseq [[x y color] seq]
(.setColor gfx (java.awt.Color. color))
(.fillRect gfx x y 1 1)))))
或使用以下方法设置框架:
请附加抛出的
NullPointerException
的堆栈跟踪。请附加抛出的NullPointerException
的堆栈跟踪。如何将其分配给局部变量?请查看增强的答案。感谢您的回答!一个问题。。我应该选择哪种方法?第一个还是第二个?在这种特殊情况下,我更喜欢doto
,因为它在我使用对象之前封装了对象的整个设置。我甚至会考虑将这个部分提取到一个单独的函数中,以便<代码> AudioMIX <代码>职责仅仅是“创建一个图像”而不是设置一个框架。当您在CuljEube中使用Swing时,您可能会感兴趣于<代码>跷跷板doto
,因为它在我使用对象之前封装了对象的整个设置。我甚至会考虑将这个部分提取到一个单独的函数中,以便<代码> AudioMIX <代码>职责仅仅是“创建一个图像”而不是设置一个框架。当你在Culjue中使用Swing时,你可能会感兴趣于<代码>跷跷板项目,它为Swing提供友好的CuljEube API。