2015-09-09 23 views
-3

我在處理異常時遇到了一個方案,下面是示例代碼。我試圖理解爲什麼下面的代碼無法編譯。在重新拋出未檢查異常之前,我正在檢查異常類型。編譯器部隊處理未檢查異常的重新拋出

public class TestException { 

    public void test() throws FileNotFoundException { 
     FileReader test = new FileReader(""); 

    } 
    public static void main(String[] args){ 
     TestException test=new TestException(); 
     try { 
      test.test(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      if(e instanceof ArithmeticException){ 
       throw e; 
      } 
      else{ 
       e.printStackTrace(); 
      } 

     } 
    } 
} 
+1

'throw e;'行拋出'Exception',雖然你知道它是'ArithmeticException'的一個實例,'e'的類型仍然是'Exception'。 –

+0

'Exception'不是未選中狀態。 – EJP

+0

爲什麼不是兩個單獨的catch塊? –

回答

0

試着改變你的catch塊如下: -

if(e instanceof ArithmeticException){ 
    throw (ArithmeticException)e; 
} 
else{ 
    e.printStackTrace(); 
} 
1

你還是扔Exception類型的引用變量eException檢查類型。編譯器只知道引用變量的類型,而不知道引用的對象的類型。如果你想保持main的方法簽名,是,你需要自動換行e到一個未經檢查的異常類型(如ArithmeticException):

if(e instanceof ArithmeticException){ 
    throw new ArithmeticException(e.getMessage()); 
} 

或將它轉換爲未經檢查的異常:

if(e instanceof ArithmeticException){ 
    throw (ArithmeticException)e; 
} 
0

我會建議使用兩個catch塊。 在catch塊中進行類型檢查並不是一個很好的做法,您可以使用其他catch語句捕獲該特定類。

catch (ArithmeticException e) { 
    // TODO Auto-generated catch block 
    throw e; 
} 
catch(Exception e) 
{ 
    e.printStackTrace(); 
} 

@Silly Freak我同意你的意見。

+0

對自身施放'ArithmeticException'是毫無意義的。 – EJP

+0

是的,我錯過了..謝謝:) –

-1

如果拋出任何異常,那麼你應該處理它,但在你的節目你能扔卻無處你要處理的異常,因此只需在主類中添加throws這樣處理異常: -

package first; 

import java.io.FileNotFoundException; 
import java.io.FileReader; 


class A3{ 

    public void test() throws FileNotFoundException { 
     FileReader test = new FileReader(""); 

    } 
    public static void main(String[] args) throws Exception{ 
     A3 test=new A3(); 
     try { 
      test.test(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      if(e instanceof ArithmeticException){ 
       throw e; 
      } 
      else{ 
       e.printStackTrace(); 
      } 

     } 
    } 
} 
1

由於參考變量e的類型爲java.lang.Exception,throw e會引發檢查異常。因此它必須在方法簽名的throws部分中聲明。

0
catch (Exception e) { 

這裏是e的有效聲明。

if(e instanceof ArithmeticException){ 

在這裏,你正在做一個運行檢查類型的e.

 throw e; 

此時的e編譯時類型Exception。所以編譯器強制執行它的規則。