2011-11-17 127 views
0

不知何故,我今天遇到了一个错误,我试图复制它。Java异常NullPointerException在自定义异常

我相信下面的代码将抛出一个NullPointerException,因为ep没有实例化,但我无法模拟它..

我相信,当异常是从主抛出的实例变量ep为空。但是运行它不会显示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) 

谢谢!

回答

2

当抛出异常(抛出e.getILException(100))时,是否调用MyException.MyException()构造函数?

不,它在此之前被调用。声明throw e.getILException(100)调用方法getILException(...)然后throw无论从该方法返回什么。

我在MyException的构造函数中注释掉了ep = new Exception();行。

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) 
+0

不幸的是,在生产源代码中,它没有被注释掉,所以我无法理解为什么。:( –

+0

欣赏你的输入= p –

+0

如果代码没有被注释掉,另一种可能性是有人在抛出异常之前改变了'ep'的值,我想看看代码'Car.run()'。 – wannik

1

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

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

2

那么,如果MyException.epnull,则会出现您描述的行为。虽然该值在实例化期间初始化,但它包私有变量,这意味着sg.java.testException中的某些其他类可能会将ep设置为null

我会看看你是否有任何代码在该包可能会这样做。如果你有权访问所有的源代码,一个简单的方法是简单地使ep私有或最终。如果你这样做,你应该开始看到编译错误,其中ep正在被修改。