自定义异常中的Java异常NullPointerException

自定义异常中的Java异常NullPointerException,java,exception,Java,Exception,不知怎的,我今天遇到了一个bug,我正试图复制它 我相信下面的代码会抛出NullPointerException,因为ep没有实例化,但我无法模拟它 我认为,当从main抛出异常时,实例变量ep为null。但运行它不会显示NullPointerException 当抛出异常时(throw e.getILException(100)),是否调用了MyException.MyException()构造函数 package sg.java.testException; public class My

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

当抛出异常(抛出e.GetileException(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());
    }
}
不,在那之前叫过。语句
throw e.getILException(100)
调用方法
getILException(…)
然后
throw
s从方法返回的任何内容

我注释掉了行
ep=newexception()在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)
当抛出异常(抛出e.GetileException(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());
    }
}
不,在那之前叫过。语句
throw e.getILException(100)
调用方法
getILException(…)
然后
throw
s从方法返回的任何内容

我注释掉了行
ep=newexception()在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)

只有当
car.run()
方法导致异常时,才能获得NPE。那个代码路径被触发了吗


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

只有当您的
car.run()
方法导致异常时,您才能获得NPE。那个代码路径被触发了吗


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

那么,如果
MyException.ep
null
,就会出现您描述的行为。当值在实例化期间初始化时,它是一个包私有变量,这意味着
sg.java.testException
中的其他类可能会将ep设置为
null


我想看看在这个包中是否有代码可以这样做。如果您可以访问所有源代码,一个简单的方法就是将
ep
设置为私有或最终。如果您这样做,您应该会在修改ep的地方看到编译错误。

那么,如果
MyException.ep
null
,就会出现您描述的行为。当值在实例化期间初始化时,它是一个包私有变量,这意味着
sg.java.testException
中的其他类可能会将ep设置为
null


我想看看在这个包中是否有代码可以这样做。如果您可以访问所有源代码,一个简单的方法就是将
ep
设置为私有或最终。如果您这样做,您应该会在修改ep的地方看到编译错误。

不幸的是,在产品源代码中,它没有被注释掉,因此我无法理解原因:(如果代码没有被注释掉,另一种可能是有人在抛出异常之前更改了
ep
的值。我想查看代码
Car.run()
。不幸的是,在生产源代码中,它没有被注释掉,因此我无法理解原因:(如果代码没有注释掉,另一种可能是有人在抛出异常之前更改了
ep
的值。我想查看代码
Car.run()
)。