在JRuby中解析Ruby表达式时发生异常

问题描述 投票:1回答:2

我创建了一个包含ruby文件内容的String,但是当我尝试使用JRubyEngine scriptEngine解析它时,在解析表达式时得到了NegativeArraySizeException。

我在JRuby引擎的yacc解析期间知道它,但是我没有更多信息。我执行的代码是:

rubyEngine = (JRubyEngine) manager.getEngineByName("jruby");
RubyClass klass = (RubyClass) rubyEngine.eval(scriptContent);

而且我在最后一行得到一个例外。 rb脚本是:

class myRubyObject
require org.scripthelper.ruby.samples.Script
  def execute() {
    10
  }
end

Script类是仅具有以下方法的java类:

public int execute();

我希望得到一个RubyClass,但是在解析过程中却得到了NegativeArraySizeException。

这里是异常的堆栈跟踪:

    at org.jruby.embed.jsr223.JRubyEngine.wrapException(JRubyEngine.java:104)
    at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:93)
    at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:142)
...
Caused by: org.jruby.embed.ParseFailedException: java.lang.NegativeArraySizeException
    at org.jruby.embed.internal.EmbedRubyRuntimeAdapterImpl.runParser(EmbedRubyRuntimeAdapterImpl.java:207)
    at org.jruby.embed.internal.EmbedRubyRuntimeAdapterImpl.parse(EmbedRubyRuntimeAdapterImpl.java:94)
    at org.jruby.embed.ScriptingContainer.parse(ScriptingContainer.java:1227)
    at org.jruby.embed.jsr223.JRubyEngine.eval(JRubyEngine.java:89)
    ... 31 more
Caused by: java.lang.NegativeArraySizeException
    at org.jruby.lexer.yacc.SyntaxException.prepareMessage(SyntaxException.java:111)
    at org.jruby.lexer.yacc.SyntaxException.<init>(SyntaxException.java:96)
    at org.jruby.lexer.yacc.RubyLexer.compile_error(RubyLexer.java:390)
    at org.jruby.parser.ParserSupport.yyerror(ParserSupport.java:1200)
    at org.jruby.parser.RubyParser$116.execute(RubyParser.java:2541)
    at org.jruby.parser.RubyParser.yyparse(RubyParser.java:1698)
    at org.jruby.parser.RubyParser.yyparse(RubyParser.java:1589)
    at org.jruby.parser.RubyParser.parse(RubyParser.java:5744)
    at org.jruby.parser.Parser.parse(Parser.java:133)
    at org.jruby.parser.Parser.parse(Parser.java:87)
    at org.jruby.Ruby.parseEval(Ruby.java:2729)
java jruby
2个回答
0
投票

scriptContent必须具有与NegativeArraySizeException相关的一些错误

检查脚本,或使用其他脚本故障证明进行测试,例如

> rubyEngine = (JRubyEngine) manager.getEngineByName("jruby"); RubyClass
> rubyEngine.eval("puts('hello world')");

0
投票

现在我可以再次发布答案。正确的脚本是:

require 'java'
class MyRubyObject
java_implements org.scripthelper.ruby.samples.Script
  def execute()
    return 10
  end
end

我之前犯的错误是:

  • def方法不应包含在{}中
  • 内容前的'require'java'应该很重要
  • 我没有正确定义org.scripthelper.ruby.samples.Script类是由Ruby类实现的]
  • 而且,Ruby类的名称必须在首字母大写

Java代码正确:

ScriptEngineManager manager = new ScriptEngineManager();
JRubyEngine rubyEngine = (JRubyEngine) manager.getEngineByName("jruby");
rubyEngine.eval(scriptContent);

RubyObject object = (RubyObject) rubyEngine.eval(className + ".new");
Script s = object.toJava(Script.class); 
© www.soinside.com 2019 - 2024. All rights reserved.