我使用javax.script.ScriptEngineManager
将jruby脚本引擎嵌入到我的java程序中
我制作了一些以 do ~ end
block 结尾的 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 返回 null,因为 isReceiverIdentical 返回 false 在 BiVariableMap.java
if (var.isReceiverIdentical(receiver)) {
return var;
}
在 isReceiverIdentical 中,该方法只是使用 '==' 将接收者与 BiVariable 的接收者进行比较。
这是 jruby bug 吗?或者我必须为此做点什么? 如果您需要有关此问题的更多信息,请评论!
<小时/>我从 ScriptEngineManager 获取了 ScriptEngine(engine) 并设置了一些 java 实例和方法,如下所示
engine.put("this", console);
engine.eval("$command = $this.java_method :command, [java.lang.String]");
这是我的测试 ruby 代码。 result
和 tab
是 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类型对象...
这会导致 updateARGV
中的检查失败,因为在 BiVariableMap
中注册变量的接收器和更新变量的另一个接收器不同。
因此,我从新的 ScriptingContainer
中获取了一个 Ruby 对象(如果本地上下文是单例,我们始终可以从中获取相同的 Ruby 对象),并使用它在我的 java 代码中创建新的 ruby 类型对象。
关于java - 使用 jruby 时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28713246/