自定义异常中的Java异常NullPointerException

时间:2011-11-17 05:53:14

标签: java exception

不知怎的,我今天遇到了一个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)

谢谢!

3 个答案:

答案 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.epnull,您所描述的行为就会出现。虽然在实例化期间初始化了值,但 是一个包私有变量,这意味着sg.java.testException中的其他一些类可能将ep设置为null

我会看看你是否在该软件包中有任何可能正在执行此操作的代码。如果您可以访问所有源代码,那么执行此操作的简单方法是将ep设为私有或最终。如果你这样做,你应该开始看到修改ep的编译错误。

答案 2 :(得分:1)

只有当car.run()方法导致异常时,才会获得NPE。是否触发了代码路径?

一个问题可能是MyException有其他构造函数没有初始化ep,或者它可能有一个没有ep的子类。