当前位置: 首页 > 知识库问答 >
问题:

使用jruby时出现NullPointerException

全流觞
2023-03-14

我使用javax将jruby脚本引擎嵌入到我的java程序中。剧本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。javaupdateARGV

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

vars.get变量返回null,因为在BiVariableM中isReceiverIdentical返回falseap.java

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

在ISReceiver中,此方法只需将接收器与双变量的接收器usgin'=='进行比较。

这是jruby bug吗?还是我必须为此做点什么?如果你需要更多关于这个问题的信息,请发表评论!

我从ScriptEngineManager获得了ScriptEngine(engine),并设置了一些java实例和方法,如下所示

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

这是我的测试ruby代码resulttab是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

共有1个答案

柳镜
2023-03-14

我通过创建新的Ruby对象在我的java代码中创建了ruby类型对象...

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

因此,我从newScriptingContainer中获得了一个Ruby对象(如果本地上下文是singleton,我们总是可以从中获得相同的Ruby对象),并使用它在java代码中创建新的Ruby类型对象。

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

 类似资料:
  • JRuby 是面向 Ruby、基于 Java 虚拟机(JVM)的一种解释程序,它结合了 Ruby 语言的简易性和功能强大的 JVM 的执行机制,包括与Java 库全面集成。Rails 彻底加快及简化了 Web 应用的开发,不过它让人觉得不够成熟,特别是在高端企业级功能方面。另一方面,Java 平台及其虚拟机、库和 应用服务器的速度、稳定性和功能方面却一直在提升,现在已被公认为是开发高端服务器应用的

  • 问题内容: 我正在尝试从中删除一些元素,但即使是最简单的示例,如本答案或本示例中的示例,也将无法使用。 使用法线代替a 并没有帮助。我想念什么?我正在使用Java 7。 问题答案: 返回由原始数组支持的列表。您对列表所做的更改也将反映在您传入的数组中。由于您无法向数组添加或删除元素,因此对列表进行这种创建也是不可能的,这就是调用失败的原因。如果要能够动态添加和删除元素,则需要使用(,等)的不同实现

  • 问题内容: 我的python列表中有以下字符串(来自命令提示符): 进一步将默认编码也更改为utf-16。但是仍然抛出异常如下: 无法确定此类字符串需要哪种转换才能正常工作。 问题答案: 无法使用utf-8,utf-16编码进行解码。 尝试latin-1编码: 或者,指定,以使其不尝试解码字符串。

  • 问题内容: 我有一个像这样的numpy数组: 我想将数组中的数字四舍五入到小数点后两位或三位。我尝试使用numpy.around和numpy.round,但是它们都给我以下错误: 我曾经 和 难道我做错了什么?还有其他方法可以有效地对大型阵列执行此操作吗? 问题答案: 您不能对作为对象的numpy数组进行四舍五入,只要可以将数组安全地转换为float即可更改此值: 对于字符串,unicode,vo

  • 问题内容: 那我在做什么错呢? 但是,我只会 问题答案: 您正在使用而不是python 2,它将输入评估为python代码。 相当于 输入 raw_input 另外,您正在尝试将“烧杯”转换为整数,这没有多大意义。 您可以这样替换您脑海中的输入: 和:

  • 我试图使用JavaCV从我的webcamera.but捕获快照,当我运行下面的代码时,我得到了一个执行。它说找不到com/googlecode/javacpp/Pointer类。我能做些什么来解决这个错误... 例外