使用 jruby 时出现 NullPointerException

NullPointerException while using 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)
    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

if (vars.containsKey((Object)name)) {
    var = vars.getVariable((RubyObject)receiver.getRuntime().getTopSelf(), name);
        var.setRubyObject(argv);

vars.getVariable returned null 因为 isReceiverIdentical return false 在 BiVariableMap.java

if (var.isReceiverIdentical(receiver)) {
    return var;
}

在isReceiverIdentical中,这个方法只是比较receiver和BiVariable的receiver usgin '=='。

这是 jruby 错误吗?或者我必须为此做些什么吗? 如果您需要有关此问题的更多信息,请发表评论!


我从 ScriptEngineManager 获取了 ScriptEngine(engine) 并像这样设置了一些 java 实例和方法

engine.put("this", console);
engine.eval("$command = $this.java_method :command, [java.lang.String]");

这是我的测试 ruby 代码。 resulttab 是 java 对象 有一些方法 return 字符串和列表。

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 类型对象...

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

所以,我从新 ScriptingContainer 得到了一个 Ruby 对象(如果本地上下文是单例,我们总能从中得到一个相同的 Ruby 对象)并用它来创建新的ruby 在我的 java 代码中输入对象。

参考:https://github.com/jruby/jruby/wiki/RedBridge#Singleton