自定义异常中的Java异常NullPointerException
不知怎的,我今天遇到了一个bug,我正试图复制它 我相信下面的代码会抛出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
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()
)。