Java 使用jruby时出现NullPointerException

Java 使用jruby时出现NullPointerException,java,nullpointerexception,jruby,Java,Nullpointerexception,Jruby,我使用javax.script.ScriptEngineManager将jruby脚本引擎嵌入到java程序中 我编写了一些以do~end块结尾的jruby代码, 运行所有代码后,出现NullPointerException。 但代码以任何其他语句结尾,不会发生异常 版本:1.7.19 Caused by: java.lang.NullPointerException at org.jruby.embed.variable.Argv.updateARGV(Argv.java:169)

我使用javax.script.ScriptEngineManager将jruby脚本引擎嵌入到java程序中

我编写了一些以do~end块结尾的jruby代码, 运行所有代码后,出现NullPointerException。 但代码以任何其他语句结尾,不会发生异常

版本:1.7.19

Caused by: java.lang.NullPointerException
    at org.jruby.embed.variable.Argv.updateARGV(Argv.java:169)
    at org.jruby.embed.variable.Argv.retrieve(Argv.java:158)
    at org.jruby.embed.variable.VariableInterceptor.retrieve(VariableInterceptor.java:154)
    at org.jruby.embed.internal.BiVariableMap.retrieve(BiVariableMap.java:378)
    at org.jruby.embed.internal.EmbedEvalUnitImpl.run(EmbedEvalUnitImpl.java:124)
在ARGV.java updateARGV中

由于isReceiverCondential返回false,vars.getVariable返回null 在BiVariableMap.java中

if (var.isReceiverIdentical(receiver)) {
    return var;
}
在ISReceiver中,此方法只需将接收器与双变量的接收器usgin'=='进行比较

这是jruby bug吗?还是我必须为此做点什么? 如果您需要有关此问题的更多信息,请发表评论

我从ScriptEngineManager获得了ScriptEngineeEngine,并设置了一些java实例和方法,如下所示

engine.put("this", console);
engine.eval("$command = $this.java_method :command, [java.lang.String]");
这是我的测试ruby代码。结果和选项卡是java对象 它有一些方法返回字符串和列表

result = $command.call "something to pass"
puts result.getMessage
tabular = result.getData

tabular.each do |tab|
  rows = tab.getRows
  rows.each do |row|
    puts row
  end
  puts tab.getColumnNames
end

我通过创建新的ruby对象在java代码中创建了ruby类型的对象

这会导致UpdateAragv中的检查失败,因为在双变量映射中注册变量的接收器和更新变量的另一个接收器不同

所以,我从new ScriptingContainer中得到了一个Ruby对象,如果本地上下文是singleton,我们总是可以从中得到相同的Ruby对象,并使用它在我的java代码中创建新的Ruby类型对象


参考资料:

我在JRuby的双变量地图上看到过类似的NPE问题。。。我做了一个测试来修复它,我95%确定你的案子也在保险范围内。。。如果您可以构建自己的jruby.jar并验证它是否有用,请在PR上发表详细评论,或者在您即将打开新的one@kares谢谢你的评论。但是当我在嵌入内部清理分支中使用您的更改构建jruby.jar时,它仍然抛出NPE。无论如何,我会进一步检查。在这种情况下,一定要显示一些要复制的代码片段…这真的不是一件容易的事-缺少一些片段,我不清楚如何触发这个错误…@kares我自己找到了解决方案。这是我的错T.T.无论如何,谢谢你支持我解决这个问题。
result = $command.call "something to pass"
puts result.getMessage
tabular = result.getData

tabular.each do |tab|
  rows = tab.getRows
  rows.each do |row|
    puts row
  end
  puts tab.getColumnNames
end