2014-02-22 167 views
0

我有一個簡單的Java代碼問題。我試圖在構造函數中拋出異常,並在那裏處理它。但它不會編譯,因爲在main函數中也需要處理這個異常。我收到錯誤 - 「未處理的異常類型MyException」(在主函數中)。 IIF我把try和catch塊放在main裏面效果很好,但是儘管如此,MyException卻是在FailingConstructor類的Constructor中處理的。構造函數中的異常,java

我想知道爲什麼我需要處理這個異常兩次?

class MyException extends Exception{ 
     MyException() 
     { 
     System.out.println("Throws MyException"); 
     } 
    } 

    public class FailingConstructor{ 
     int a; 
     int b; 

FailingConstructor(int a, int b) throws MyException 
{ 

    try{ 
     this.a=a; 
    if(this.a==9) 
     { 
      throw new MyException(); 
     } 
    this.b=b; 
    }catch(MyException e) 
    { 
     System.out.println("Wyjatek z poziomu konstruktora"); 
    } 


} 

public static void main(String[] args) 
{ 
    FailingConstructor nowy = new FailingConstructor(9,6); 
    System.out.println(nowy.a); 
    System.out.println(nowy.b); 



} 

}

碼本的主要功能運作良好:

 public static void main(String[] args) 
     { 
      try{ 
        FailingConstructor nowy = new FailingConstructor(9,6); 
       System.out.println(nowy.a); 
       System.out.println(nowy.b); 
      } 
      catch(MyException e) 
      { 
      e.printStackTrace(); 
      } 


     } 
+5

它從構造函數 – Camilo

+0

中移除'throws MyException'它的工作原理,謝謝! – user3131037

回答

0

你宣佈你將拋出一個異常,但你有沒有在主試圖捕捉這一點。

如果你不想要構造函數的異常outrside你可以刪除拋出,否則你需要嘗試在主要捕獲。

0

解決方案非常簡單:從構造函數中刪除throws MyException。當它在那裏時,編譯器會受到很大的創傷,因爲可能會拋出某種檢查的異常。這是不夠聰明的,意識到總是會處理這樣的檢查異常。

0

只需從構造函數中刪除throws MyExceptionFailingConstructor聲明

0

您可以刪除在FailingConstructor拋出MyException或者你可以移除try/catch子句,只是簡單的有拋出MyException聲明。無論何時顯式拋出異常(或帶有檢查異常),處理該部分的方法必須具有一種機制來捕獲它,或者應該明確聲明它將拋出該異常。

0

問題是您聲明瞭兩次異常。您不需要在構造函數中說throws MyException - try/catch塊您將會處理它沒有問題。如果你還說throws MyException,編譯器認爲你的構造函數會拋出另一個異常,除了你捕獲的異常。

0

如果您聲明該方法會拋出異常,那麼確保使用此函數的某些人可以處理它。

您不能在方法main中聲明異常,因爲它無法處理。