2014-12-02 54 views
3

處理我有以下簡單的代碼:逮住異常沒有用正確的方法

class Test { 

    public static void main(String[] args) { 

     Test t = new Test(); 

     try { 
      t.throwAnotherException(); 
     } catch (AnotherException e) { 
      t.handleException(e); 
     } 

     try { 
      t.throwAnotherException(); 
     } catch (Exception e) { 
      System.out.println(e.getClass().getName()); 
      t.handleException(e); 
     } 

    } 

    public void throwAnotherException() throws AnotherException { 
     throw new AnotherException(); 
    } 

    public void handleException(Exception e) { 
     System.out.println("Handle Exception"); 
    } 

    public void handleException(AnotherException e) { 
     System.out.println("Handle Another Exception"); 
    } 

} 

class AnotherException extends Exception { 

} 

爲什麼叫第二捕獲方法是一個帶有簽名void handleException(Exception e),而那種例外的是AnotherException

+0

我沒有完全明白你的問題,但我覺得你在混合使用方法名和異常名。 – Sid 2014-12-02 10:55:30

回答

6

重載方法在編譯時解決,基於形參類型,不運行時類型

這意味着,如果B extends A,你有

void thing(A x); 

void thing(B x); 

然後

B b = new B(); 
thing(b); 

將尋找一個thing(),需要一個B,因爲正規的類型bB;但

A b = new B(); 
thing(b); 

將尋找一個thing()接受一個A,因爲正規的類型bA,儘管其運行時的實際類型將是B

在您的代碼中,e的正式類型在第一種情況下爲AnotherException,而在第二種情況下爲Exception。每種情況下的運行時間類型爲AnotherException

0

AnotherException擴展了Exception,這意味着在任何你使用「Exception」的地方,使用「AnotherException」的實例都將有資格。

你應該仔細閱讀擴展類,以獲得更詳細的解釋,這是如何工作的,因爲它在編程中非常重要。

0

我想你想測試哪個Exception會被抓到,對吧?

然後修改代碼以拋出只有一個Exception

try { 
     t.throwAnotherException(); 
    } catch (AnotherException e) { 
     t.handleException(e); 
    } 
    catch (Exception e) { 
     System.out.println(e.getClass().getName()); 
     t.handleException(e); 
    } 

其工作正常。

0

Exception是超類,所以如果你用(Exception e)寫你的catch子句,它總會得到滿足並得到執行。

爲了改善您的代碼,您可以修改您的代碼,如下所述。

class Test { 

    public static void main(String[] args) { 

     Test t = new Test(); 

     try { 
      t.throwAnotherException(); 
     } catch (AnotherException e) { 
      t.handleException(e); 
     } 

     try { 
      t.throwAnotherException(); 
     }catch (AnotherException e) { 
      t.handleException(e); 
     }catch (Exception e) { 
      System.out.println(e.getClass().getName()); 
      t.handleException(e); 
     } 

    } 

    public void throwAnotherException() throws AnotherException { 
     throw new AnotherException(); 
    } 

    public void handleException(Exception e) { 
     System.out.println("Handle Exception"); 
    } 

    public void handleException(AnotherException e) { 
     System.out.println("Handle Another Exception"); 
    } 

} 

class AnotherException extends Exception { 

}