我使用javax.script.ScriptEngineManager
我制作了一些以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代码。 result
和tab
是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
答案 0 :(得分:0)
我通过创建新的Ruby
对象...
这会导致updateARGV
中的检查失败,因为在BiVariableMap
中注册变量的接收器和更新变量的另一个接收器是不同的。
所以,我从新的ScriptingContainer
得到了一个Ruby对象(如果本地上下文是单例的话,我们总是得到一个相同的Ruby对象)并用它在我的java代码中创建新的ruby类型对象。