2

当我尝试在 IOKE shell 中执行代码时,它崩溃了。

 >ioke
 iik> "Hello World" println
Exception in thread "main" java.lang.NullPointerException
            at ioke.lang.IokeIO$2.activate(IokeIO.java:129)
            at ioke.lang.TypeCheckingNativeMethod.activate(TypeCheckingNativeMethod.java:50)
            at ioke.lang.IokeObject.activate(IokeObject.java:1053)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:1038)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:514)
            at ioke.lang.IokeObject.perform(IokeObject.java:659)
            at ioke.lang.IokeObject.perform(IokeObject.java:592)
            at ioke.lang.IokeObject.perform(IokeObject.java:522)
            at ioke.lang.Message.sendTo(Message.java:999)
            at ioke.lang.Message.evaluateCompleteWithoutExplicitReceiver(Message.java:1145)
            at ioke.lang.Message.getEvaluatedArgument(Message.java:979)
            at ioke.lang.Message.getEvaluatedArgument(Message.java:983)
            at ioke.lang.FlowControlBehavior$9.activate(FlowControlBehavior.java:379)
            at ioke.lang.IokeObject.activate(IokeObject.java:1053)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:1038)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:514)
            at ioke.lang.IokeObject.perform(IokeObject.java:659)
            at ioke.lang.IokeObject.perform(IokeObject.java:592)
            at ioke.lang.IokeObject.perform(IokeObject.java:522)
            at ioke.lang.Locals$1.activate(Locals.java:63)
            at ioke.lang.IokeObject.activate(IokeObject.java:1053)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:1038)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:514)
            at ioke.lang.IokeObject.perform(IokeObject.java:659)
            at ioke.lang.IokeObject.perform(IokeObject.java:592)
            at ioke.lang.IokeObject.perform(IokeObject.java:522)
            at ioke.lang.Message.sendTo(Message.java:999)
            at ioke.lang.Message.evaluateCompleteWith(Message.java:1093)
            at ioke.lang.LexicalBlock.activate(LexicalBlock.java:198)
            at ioke.lang.IokeObject.activate(IokeObject.java:1053)
            at ioke.lang.LexicalBlock$2.activate(LexicalBlock.java:86)
            at ioke.lang.IokeObject.activate(IokeObject.java:1053)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:1038)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:514)
            at ioke.lang.IokeObject.perform(IokeObject.java:659)
            at ioke.lang.IokeObject.perform(IokeObject.java:592)
            at ioke.lang.IokeObject.perform(IokeObject.java:522)
            at ioke.lang.Message.sendTo(Message.java:1011)
            at ioke.lang.FileSystem$7.activate(FileSystem.java:308)
            at ioke.lang.IokeObject.activate(IokeObject.java:1053)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:1038)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:514)
            at ioke.lang.IokeObject.perform(IokeObject.java:659)
            at ioke.lang.IokeObject.perform(IokeObject.java:592)
            at ioke.lang.IokeObject.perform(IokeObject.java:522)
            at ioke.lang.Message.sendTo(Message.java:999)
            at ioke.lang.Message.evaluateCompleteWithoutExplicitReceiver(Message.java:1145)
            at ioke.lang.ConditionsBehavior$4.activate(ConditionsBehavior.java:342)
            at ioke.lang.IokeObject.activate(IokeObject.java:1053)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:1038)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:514)
            at ioke.lang.IokeObject.perform(IokeObject.java:659)
            at ioke.lang.IokeObject.perform(IokeObject.java:592)
            at ioke.lang.IokeObject.perform(IokeObject.java:522)
            at ioke.lang.Locals$1.activate(Locals.java:63)
            at ioke.lang.IokeObject.activate(IokeObject.java:1053)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:1038)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:514)
            at ioke.lang.IokeObject.perform(IokeObject.java:659)
            at ioke.lang.IokeObject.perform(IokeObject.java:592)
            at ioke.lang.IokeObject.perform(IokeObject.java:522)
            at ioke.lang.Message.sendTo(Message.java:999)
            at ioke.lang.Message.evaluateCompleteWithoutExplicitReceiver(Message.java:1145)
            at ioke.lang.Message.getEvaluatedArgument(Message.java:979)
            at ioke.lang.Message.getEvaluatedArgument(Message.java:983)
            at ioke.lang.FlowControlBehavior$7.activate(FlowControlBehavior.java:298)
            at ioke.lang.IokeObject.activate(IokeObject.java:1053)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:1038)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:514)
            at ioke.lang.IokeObject.perform(IokeObject.java:659)
            at ioke.lang.IokeObject.perform(IokeObject.java:592)
            at ioke.lang.IokeObject.perform(IokeObject.java:522)
            at ioke.lang.Locals$1.activate(Locals.java:63)
            at ioke.lang.IokeObject.activate(IokeObject.java:1053)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:1038)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:514)
            at ioke.lang.IokeObject.perform(IokeObject.java:659)
            at ioke.lang.IokeObject.perform(IokeObject.java:592)
            at ioke.lang.IokeObject.perform(IokeObject.java:522)
            at ioke.lang.Message.sendTo(Message.java:999)
            at ioke.lang.Message.evaluateCompleteWithoutExplicitReceiver(Message.java:1145)
            at ioke.lang.ConditionsBehavior$4.activate(ConditionsBehavior.java:342)
            at ioke.lang.IokeObject.activate(IokeObject.java:1053)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:1038)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:514)
            at ioke.lang.IokeObject.perform(IokeObject.java:659)
            at ioke.lang.IokeObject.perform(IokeObject.java:592)
            at ioke.lang.IokeObject.perform(IokeObject.java:522)
            at ioke.lang.Locals$1.activate(Locals.java:63)
            at ioke.lang.IokeObject.activate(IokeObject.java:1053)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:1038)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:514)
            at ioke.lang.IokeObject.perform(IokeObject.java:659)
            at ioke.lang.IokeObject.perform(IokeObject.java:592)
            at ioke.lang.IokeObject.perform(IokeObject.java:522)
            at ioke.lang.Message.sendTo(Message.java:999)
            at ioke.lang.Message.evaluateCompleteWith(Message.java:1093)
            at ioke.lang.DefaultMethod.activate(DefaultMethod.java:283)
            at ioke.lang.IokeObject.activate(IokeObject.java:1053)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:1038)
            at ioke.lang.IokeObject.getOrActivate(IokeObject.java:514)
            at ioke.lang.IokeObject.perform(IokeObject.java:659)
            at ioke.lang.IokeObject.perform(IokeObject.java:592)
            at ioke.lang.IokeObject.perform(IokeObject.java:522)
            at ioke.lang.Message.sendTo(Message.java:999)
            at ioke.lang.Message.evaluateComplete(Message.java:1066)
            at ioke.lang.Runtime.evaluateString(Runtime.java:525)
            at ioke.lang.Main.main(M

ain.java:149)

是什么导致这个错误?我使用的是 Windows 10,我的 IOKE_HOME 和 JAVA_HOME 环境变量已设置(否则 REPL 将不会首先被调用)。任何帮助将不胜感激。

4

1 回答 1

0

我怀疑这与 Ioke 试图使用一些 Java API 来检索用户的主目录有关。HOME尽管设置了环境变量,但我发现在以任何没有主目录的用户身份运行 Ioke 时,该问题在 Linux 上重现。JAVA_OPTS我可以通过设置环境变量来解决这个问题:

$ JAVA_OPTS="-Duser.home=$PWD" ioke

请注意,其他基于 Java 的编程语言(如 Kotlin)也会出现类似的问题,有时可以应用相同的解决方法。显然,有人在 Java API 的深处做出了非常糟糕的设计决定。

请注意,Ioke 自 2011 年以来已被完全放弃,未来不太可能收到任何更新或支持。

于 2020-07-30T22:32:56.213 回答