不知怎的,我今天遇到了一个bug,我试图复制它。
我相信下面的代码会抛出NullPointerException,因为ep
没有实例化,但我无法模拟它..
我认为当从main抛出异常时,实例变量ep
为null。但是运行它不会显示NullPointerException。
抛出异常(throw e.getILException(100)
)时,MyException.MyException()
构造函数是否被调用?
package sg.java.testException;
public class MyException extends Exception {
Exception ep;
public MyException() {
super();
ep = new Exception();
}
public OtherException getILException(long txnId) {
// the error is here, according to the stacktrace
return new OtherException(ep, ep.toString());
}
}
呼叫者:
public static void main(String args[]) throws OtherException{
try{
Car.run();
}catch (MyException e){
throw e.getILException(100);
}
}
汽车代码:
public class Car {
public static void run() throws MyException {
throw new MyException();
}
}
我希望能够复制此异常:
java.lang.NullPointerException
at sg.java.testException.MyException.getILException(MyException.java:13)
at sg.java.testException.ExceptionTest.main(ExceptionTest.java:8)
谢谢!
答案 0 :(得分:2)
抛出异常时(抛出e.getILException(100)),是否调用MyException.MyException()构造函数?
没有。在此之前调用它。语句throw e.getILException(100)
调用方法getILException(...)
然后调用throw
从方法返回的任何内容。
我在ep = new Exception();
的构造函数中注释掉了MyException
行。
class OtherException extends Exception {
OtherException(Exception ex, String exStr) {}
}
class MyException extends Exception {
Exception ep;
public MyException() {
super();
// ep = new Exception();
}
public OtherException getILException(long txnId) {
// the error is here, according to the stacktrace
return new OtherException(ep, ep.toString());
}
}
public class Test {
public static void main(String args[]) throws OtherException {
try{
throw new MyException();
}catch (MyException e){
throw e.getILException(100);
}
}
}
以下是结果。
Exception in thread "main" java.lang.NullPointerException
at MyException.getILException(Test.java:16)
at Test.main(Test.java:25)
答案 1 :(得分:2)
好吧,如果MyException.ep
为null
,您所描述的行为就会出现。虽然在实例化期间初始化了值,但 是一个包私有变量,这意味着sg.java.testException
中的其他一些类可能将ep设置为null
。
我会看看你是否在该软件包中有任何可能正在执行此操作的代码。如果您可以访问所有源代码,那么执行此操作的简单方法是将ep
设为私有或最终。如果你这样做,你应该开始看到修改ep的编译错误。
答案 2 :(得分:1)
只有当car.run()
方法导致异常时,才会获得NPE。是否触发了代码路径?
一个问题可能是MyException有其他构造函数没有初始化ep,或者它可能有一个没有ep的子类。