Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Rhino中获取当前脚本名称和行号?_Java_Javascript_Exception_Applet_Rhino - Fatal编程技术网

Java 如何在Rhino中获取当前脚本名称和行号?

Java 如何在Rhino中获取当前脚本名称和行号?,java,javascript,exception,applet,rhino,Java,Javascript,Exception,Applet,Rhino,我正在使用Java和Mozilla Rhino创建一个游戏引擎,我希望所有错误都调用一个函数,并向它提供错误消息,如 ... } catch(Exception e) { Abort(e); } ... public void Abort(str) { System.out.println("Script error in "current_script_name+" line: "+line_number\n\n"+e); } 这对RhinoException来说很容易,但我

我正在使用Java和Mozilla Rhino创建一个游戏引擎,我希望所有错误都调用一个函数,并向它提供错误消息,如

...
} catch(Exception e) {
    Abort(e);
}
...
public void Abort(str) {
    System.out.println("Script error in "current_script_name+" line: "+line_number\n\n"+e);
}

这对RhinoException来说很容易,但我希望对其他人也一样,比如IOException

这在一定程度上取决于异常是如何抛出的,所以我需要猜测一下。这取决于执行Rhino时使用的优化级别

我猜异常正在从本机Java代码中抛出(即,您没有使用
抛出新包.Java.io.IOException(“…”
)。在这种情况下,可以使用printStackTrace()来解决这个问题。下面是一个小脚本(名为
test.jsh.js
,您将在堆栈跟踪中看到),可以在Rhino shell中运行:

try {
    //  foo does not exist
    var stream = new Packages.java.io.FileInputStream("foo");
} catch (e) {
    e.rhinoException.printStackTrace();
}
。。。其输出:

$ java -jar $(cygpath -w /opt/java/rhino/1.7R2/js.jar) -opt -1 test.jsh.js org.mozilla.javascript.WrappedException: Wrapped java.io.FileNotFoundException: foo (The system cannot find the file specified) (test.jsh.js#4) at org.mozilla.javascript.Context.throwAsScriptRuntimeEx(Context.java:1773) at org.mozilla.javascript.MemberBox.newInstance(MemberBox.java:202) at org.mozilla.javascript.NativeJavaClass.constructSpecific(NativeJavaClass.java:281) at org.mozilla.javascript.NativeJavaClass.construct(NativeJavaClass.java:200) at org.mozilla.javascript.Interpreter.interpretLoop(Interpreter.java:3377) at script(test.jsh.js:4) at org.mozilla.javascript.Interpreter.interpret(Interpreter.java:2487) at org.mozilla.javascript.InterpretedFunction.call(InterpretedFunction.java:164) at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:398) at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3065) at org.mozilla.javascript.InterpretedFunction.exec(InterpretedFunction.java:175) at org.mozilla.javascript.tools.shell.Main.evaluateScript(Main.java:564) at org.mozilla.javascript.tools.shell.Main.processFileSecure(Main.java:486) at org.mozilla.javascript.tools.shell.Main.processFile(Main.java:452) at org.mozilla.javascript.tools.shell.Main.processSource(Main.java:443) at org.mozilla.javascript.tools.shell.Main.processFiles(Main.java:196) at org.mozilla.javascript.tools.shell.Main$IProxy.run(Main.java:117) at org.mozilla.javascript.Context.call(Context.java:515) at org.mozilla.javascript.ContextFactory.call(ContextFactory.java:507) at org.mozilla.javascript.tools.shell.Main.exec(Main.java:179) at org.mozilla.javascript.tools.shell.Main.main(Main.java:157) Caused by: java.io.FileNotFoundException: foo (The system cannot find the file specified) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.(Unknown Source) at java.io.FileInputStream.(Unknown Source) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at org.mozilla.javascript.MemberBox.newInstance(MemberBox.java:194) ... 18 more $java-jar$(cygpath-w/opt/java/rhino/1.7R2/js.jar)-opt-1 test.jsh.js org.mozilla.javascript.WrappedException:Wrapped java.io.FileNotFoundException:foo(系统找不到指定的文件)(test.jsh.js#4) 位于org.mozilla.javascript.Context.throwAsScriptRuntimeEx(Context.java:1773) 位于org.mozilla.javascript.MemberBox.newInstance(MemberBox.java:202) 位于org.mozilla.javascript.NativeJavaClass.constructSpecific(NativeJavaClass.java:281) 位于org.mozilla.javascript.NativeJavaClass.construct(NativeJavaClass.java:200) 位于org.mozilla.javascript.Interpreter.interpreterloop(Interpreter.java:3377) at脚本(test.jsh.js:4) 位于org.mozilla.javascript.explorer.exploration(explorer.java:2487) 在org.mozilla.javascript.expressedfunction.call上(expressedfunction.java:164) 位于org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:398) 位于org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3065) 位于org.mozilla.javascript.expressedfunction.exec(expressedfunction.java:175) 位于org.mozilla.javascript.tools.shell.Main.evaluateScript(Main.java:564) 位于org.mozilla.javascript.tools.shell.Main.processFileSecure(Main.java:486) 位于org.mozilla.javascript.tools.shell.Main.processFile(Main.java:452) 位于org.mozilla.javascript.tools.shell.Main.processSource(Main.java:443) 位于org.mozilla.javascript.tools.shell.Main.processFiles(Main.java:196) 位于org.mozilla.javascript.tools.shell.Main$IProxy.run(Main.java:117) 位于org.mozilla.javascript.Context.call(Context.java:515) 位于org.mozilla.javascript.ContextFactory.call(ContextFactory.java:507) 位于org.mozilla.javascript.tools.shell.Main.exec(Main.java:179) 位于org.mozilla.javascript.tools.shell.Main.Main(Main.java:157) 原因:java.io.FileNotFoundException:foo(系统找不到指定的文件) 在java.io.FileInputStream.open(本机方法) 位于java.io.FileInputStream。(未知源) 位于java.io.FileInputStream。(未知源) 位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 位于sun.reflect.NativeConstructorAccessorImpl.newInstance(未知源) 位于sun.reflect.delegatingConstructor或AccessorImpl.newInstance(未知源) 位于java.lang.reflect.Constructor.newInstance(未知源) 位于org.mozilla.javascript.MemberBox.newInstance(MemberBox.java:194) ... 还有18个
如果您确实想准确地使用上面的
Abort()
函数,您可以从上面的堆栈跟踪中解析相应的行;或者,您可以显示整个堆栈跟踪,这可能会更有用,具体取决于您要执行的操作。

为什么不为您的异常(如Log4j)设置某种日志功能?有了它,您可以设置一个
属性
文件,这样每当您记录某个内容时,它都会以相同的方式输出(而不是总是调用
Abort()
函数。此外,Log4j支持获取行号和其他功能:

我想这样做,但我想知道是否有更简单/更直接的方法。谢谢所有人,我需要使用中止函数,因为我正在重新实现游戏引擎,我的目标是让在该游戏引擎中运行的游戏也在t中运行他的。