解析 JRuby 中的 Ruby 表达式时出现异常
Exception when parsing a Ruby expression in JRuby
我创建了一个包含 ruby 文件内容的字符串,但是当我尝试使用 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
脚本 class 是一个 java class,它只有以下方法:
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.RubyParser6.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')");
现在我又可以post回答了。正确的脚本是:
require 'java'
class MyRubyObject
java_implements org.scripthelper.ruby.samples.Script
def execute()
return 10
end
end
我之前犯的错误是:
- def 方法不应包含在 {} 中
- 内容前的要求'java'应该很重要
- 我没有正确定义 org.scripthelper.ruby.samples.Script class 是由 Ruby class
实现的
- 此外 Ruby class 的名称首字母必须大写
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);
我创建了一个包含 ruby 文件内容的字符串,但是当我尝试使用 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
脚本 class 是一个 java class,它只有以下方法:
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.RubyParser6.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')");
现在我又可以post回答了。正确的脚本是:
require 'java'
class MyRubyObject
java_implements org.scripthelper.ruby.samples.Script
def execute()
return 10
end
end
我之前犯的错误是:
- def 方法不应包含在 {} 中
- 内容前的要求'java'应该很重要
- 我没有正确定义 org.scripthelper.ruby.samples.Script class 是由 Ruby class 实现的
- 此外 Ruby class 的名称首字母必须大写
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);