使用jruby时出现NullPointerException

时间:2015-02-25 07:14:18

标签: 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)
    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);

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

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

在isReceiverIdentical中,此方法只是将接收器与BiVariable的接收器usgin'=='进行比较。

这是一个犹豫不决的虫子吗?或者我必须为此做点什么? 如果您需要有关此问题的更多信息,请发表评论!


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

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

这是我的测试ruby代码。 resulttab是java对象 有一些方法返回String和list。

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

1 个答案:

答案 0 :(得分:0)

我通过创建新的Ruby对象...

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

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

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

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