2011-11-17 158 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正在被修改。

相關問題