Clojure 调用(.write socket data)时出现空指针异常

Clojure 调用(.write socket data)时出现空指针异常,clojure,nullpointerexception,irc,Clojure,Nullpointerexception,Irc,我正在编写一个简单的IRC bot来尝试了解更多关于Clojure的信息,使用标准Java套接字和循环来读取/解析数据,但是由于某种原因,当我尝试在MOTD end消息之后发送JOIN消息时,我得到了一个空指针 这是我的密码 (use 'clojure.java.io '[clojure.string :as s :only (split)]) (def sock (java.net.Socket. "iris.archivesmc.com" 6667)) (def write-stream

我正在编写一个简单的IRC bot来尝试了解更多关于Clojure的信息,使用标准Java套接字和循环来读取/解析数据,但是由于某种原因,当我尝试在MOTD end消息之后发送JOIN消息时,我得到了一个空指针

这是我的密码

(use 'clojure.java.io
'[clojure.string :as s :only (split)])

(def sock (java.net.Socket. "iris.archivesmc.com" 6667))

(def write-stream (writer sock))
(def read-stream  (reader sock))

(defn write [message]
    (.write write-stream (str message "\r\n"))
    (println (str "-> " message))
    (.flush write-stream)
)

(defn parseMessage [buffer]
    (if
        (= (apply str (take-last 2 buffer)) "\r\n" )
        (do
            (let [parts (split buffer #"\s")]
                (println (s/replace buffer "\r\n" ""))
                (when
                    (= (first parts) "PING")
                    ;; We need to PONG to this or we'll ping out
                    (write (str "PONG " (second parts)))
                )
                (when
                    (= (apply str(take 1 (first parts))) ":" )
                    ;; Message with a numerical prefix
                    ;; :server numeric our-nick message
                    (
                        (if
                            (= (second parts) "376")
                            ;; MOTD end
                            ;; Join #clojure
                            (write "JOIN #clojure") ;; This errors for some reason
                        )
                    )
                )
            )
            ""
        )
        buffer
    )
)

(defn readLoop []
    (loop [buffer ""]
        ;;(println (str "Looping.. -> " buffer))
        (let [nbuf (parseMessage buffer)
              nchr (.read read-stream)  ]
            (if-not (= nchr -1)
                (recur (str nbuf (char nchr)))
            )
        )
    )
)

(write "NICK gClojureTestBot")
(write "USER Clojure Imma Bot :Clojure Testing Bot")
(readLoop)
这是我的输出(带有回溯等)

我觉得这很奇怪,因为以前对
write
的调用都能正常工作。再说一次,作为一个Clojure(和Java)noob,我可能做了一些愚蠢的事情

有人有什么想法吗


编辑:如果有问题,我使用的是Java 7和Clojure 1.4.0,问题在于下面的代码块

            (when
                (= (apply str(take 1 (first parts))) ":" )
                ;; Message with a numerical prefix
                ;; :server numeric our-nick message
                (
                    (if
                        (= (second parts) "376")
                        ;; MOTD end
                        ;; Join #clojure
                        (write "JOIN #clojure") ;; This errors for some reason
                    )
                )
            )

具体地说,围绕
(if)
语句的
()
被加倍。括号太多。删除多余的代码修复了问题。

问题在于以下代码块

            (when
                (= (apply str(take 1 (first parts))) ":" )
                ;; Message with a numerical prefix
                ;; :server numeric our-nick message
                (
                    (if
                        (= (second parts) "376")
                        ;; MOTD end
                        ;; Join #clojure
                        (write "JOIN #clojure") ;; This errors for some reason
                    )
                )
            )

具体地说,围绕
(if)
语句的
()
被加倍。括号太多。删除多余的括号修复了问题。

通过遵循括号的标准lisp约定,您可以使意外执行此操作更加困难。如果没有帕伦人在自己的线路上,几乎不可能意外地写((foo-bar))而不是(foo-bar),如果你这样做了,它会非常明显并且很容易修复。@amalloy我喜欢你关于定位帕伦人的回答,并且被告知在最后跟踪他们。@amalloy Smart thinking那里;我会记住的。谢谢。通过遵循括号的标准lisp约定,您可以使意外执行此操作变得更加困难。如果没有帕伦人在自己的线路上,几乎不可能意外地写((foo-bar))而不是(foo-bar),如果你这样做了,它会非常明显并且很容易修复。@amalloy我喜欢你关于定位帕伦人的回答,并且被告知在最后跟踪他们。@amalloy Smart thinking那里;我会记住的。谢谢