使用 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 代码。 result
和 tab
是 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 代码中输入对象。
我使用 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);
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 代码。 result
和 tab
是 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 代码中输入对象。