Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swing Clojure空指针异常_Swing_Clojure - Fatal编程技术网

Swing Clojure空指针异常

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]

我试图写一个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]
  (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。