我创建了一个包含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)
scriptContent必须具有与NegativeArraySizeException相关的一些错误
检查脚本,或使用其他脚本故障证明进行测试,例如
> rubyEngine = (JRubyEngine) manager.getEngineByName("jruby"); RubyClass
> rubyEngine.eval("puts('hello world')");
现在我可以再次发布答案。正确的脚本是:
require 'java'
class MyRubyObject
java_implements org.scripthelper.ruby.samples.Script
def execute()
return 10
end
end
我之前犯的错误是:
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);