【发布时间】:2012-07-10 01:29:11
【问题描述】:
我知道出错的行是to_return = find(list,false); 当出现NullPointerException 类型的错误时,如何获取该行的行号?还是一般的行号?
我尝试了几件事。最接近的是这个Called.getLineNumber(),它给了我StackTraceElement Called = new Throwable().fillInStackTrace().getStackTrace()[0];的行号
public TestObject[] myfind(Subitem list )throws Exception{
TestObject[]to_return=null;
try {
to_return = find(list,false);
}
catch (RationalTestException ex) {
//logStoreException(ex);
StackTraceElement Called = new Throwable().fillInStackTrace().getStackTrace()[0];
StackTraceElement Calling = new Throwable().fillInStackTrace().getStackTrace()[1];
throw new Exception (this.add_debugging_info(Called, Calling, ex.getMessage()));
}
catch (NullPointerException npe) {
StackTraceElement Called = new Throwable().fillInStackTrace().getStackTrace()[0];
StackTraceElement Calling = new Throwable().fillInStackTrace().getStackTrace()[1];
logStoreException(npe);
System.out.println("Line number: "+npe.getStackTrace()[0].getLineNumber());
System.out.println("Line number2: "+Integer.toString(Called.getLineNumber()));
System.out.println(this.add_debugging_info(Called, Calling, npe.getMessage()));
throw new Exception (this.add_debugging_info(Called, Calling, npe.getMessage()));
}
catch (Exception ex) {
StackTraceElement Called = new Throwable().fillInStackTrace().getStackTrace()[0];
StackTraceElement Calling = new Throwable().fillInStackTrace().getStackTrace()[1];
throw new Exception (this.add_debugging_info(Called, Calling, ex.getMessage()));
}
finally {
//unregisterAll();
//unregister(to);
return to_return;
}
}
【问题讨论】:
-
如果你在可观察性的情况下编译,行号应该列在异常回溯中。
-
您的代码正在创建一个异常并询问该异常是在哪里创建的。要获取真正异常的行号,您需要使用真正的异常,而不是您创建的异常。
-
(即,在
ex上调用getStackTrace。)(并且不要调用fillInStackTrace,因为这会覆盖捕获的异常中的信息。) -
有什么原因你不能只做
npe.printStackTrace();/为什么你的运行时代码需要有行号?如果您只是希望行号信息通过您重新抛出的Exception传播,您可以随时执行throw new Exception(npe);,这将保留有关原始Exception的所有详细信息。 -
(并且 printStackTrace 可以正常工作,如果您使用 原始 异常而不是您创建的异常调用它。您知道
Exception是Throwable的子类,对吧?)
标签: java error-handling