如何解决在if-else中执行多个语句而没有nullpointer异常
|| 我正在尝试对Clojure和函数式编程进行更深入的研究。 在我的代码中,我有一个(def server (spawn-server))
。现在,我需要一个简短的函数供REPL检查此套接字的状态。
这是我目前所拥有的:
(defn status []
(if server
(
(println \"server is up and running\")
(println \"connections:\" (connection-count server))
)
(println \"server is down\")))
如果服务器为零,那么一切正常,但是如果服务器正在运行,这是REPL上的输出:
=> (status)
server is up and running
connections: 0
#<CompilerException java.lang.NullPointerException (NO_SOURCE_FILE:0)>
我不确定我是否能看到问题,但是我不知道这应该如何工作:-)
我在这里是这样的:
((println \"foo\")(println \"foo\"))
哪个将被评估为“ 4”,从而导致NullPointerException?
通常,我不会使用外部括号,但是如何为if条件创建某种\“ block \”语句。如果我不使用它们,则第二个println将被其他使用。
可以使用let作为某种“ block”语句的用法:
(let []
(println \"server is up and running\"),(println \"connections:\" (connection-count server)) )
但是我不太确定这是否是“正确的”解决方案?
解决方法
使用
do
:
(defn status []
(if server
(do
(println \"server is up and running\")
(println \"connections:\" (connection-count server)))
(println \"server is down\")))
通常,在Lisps中,您不能仅添加括号进行分组。
((println \"foo\") (println \"foo\"))
在这里,将尝试调用第一个“ 9”的返回值(作为一个函数),而第二个的返回值作为参数。这些是非常基本的评估规则,因此,我建议您阅读一些有关Clojure或Lisps的入门书籍或文档。
在Clojure主页的评估部分中:
非空列表被视为呼叫
特殊格式,宏或
功能。呼叫具有以下形式
(运算符操作数*)。
宏或特殊格式可能会“破坏”该规则。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。