0

我正在開發一個庫,並且在一些方法中,我想拋出一個ClassNotFoundException但是eclipse迫使我'添加拋出聲明'或'使用try/catch環繞'。我不想實現他們中的任何一個,我想要的是把這個excepcion扔給班上的客戶。我已經看到所有擴展了ReflectiveOperationException的類迫使我添加或包圍異常。另一方面,我已經看到,擴展RuntimeException的類不需要添加或包圍異常。爲什麼ClassNotFoundException會出現這種行爲?

由於我的問題的抽象,想象一個像這樣的代碼:

public Class getClassForCellType(int cellTypeRequested) { 

     Class cellClassRequired = null; 

     if (cellTypeRequested == 0) { 
      cellClassRequired = CellA.class; 
     } else if (cellTypeRequested == 1) { 
      cellClassRequired = CellB.class; 
     } else { 
      throw new ClassNotFoundException("cellType Not Available"); 
     } 

     return cellClassRequired; 
    } 

我想拋出ClassNotFoundException的,因爲是發生什麼事,我不喜歡用另一種更通用類。有人可以請解釋爲什麼這些類需要直接處理它們。

+7

【JAVA:檢查VS未經檢查的異常說明](http://stackoverflow.com/questions/6115896/java-checked-vs-unchecked-exception -explanation) – 2014-10-20 16:37:31

+1

你有沒有聽說過「檢查異常」這個詞?這是Java語言的一個臭名昭着的方面。 – 2014-10-20 16:37:46

+0

添加一個'throws'聲明並不是真正「實現」任何東西;這對客戶來說更像是一種信號,他們稱這種方法可能拋出這個異常,並且他們或者需要捕獲它或者聲明他們也拋出它。這可能是你想要做的。 – ajb 2014-10-20 16:43:31

回答

2

我想是因爲你不使用的ClassNotFoundException它的預期目的的問題出現了。當在類路徑中沒有提供所請求的Java類的實現時,會非常明確地拋出此異常。

這裏您試圖將參數轉換爲類,但這與缺少類定義的系統級錯誤不同。

我想創建自己的CellTypeClassNotResolvedException延伸的RuntimeException和扔東西,而不是:

public CellTypeClassNotResolvedException extends RuntimeException { 
    public CellTypeClassNotResolvedException(String s) { 
     super(s); 
    } 
} 
+0

你是對的。感謝你的回答! :) – Androider 2014-10-20 16:54:18

2

Eclipse是告訴你(作爲任何Java編譯器必須做的),如果你想有一個ClassNotFoundException能夠逃脫你的方法,該方法必須聲明這是可能的,就像這樣:

public Class getClassForCellType(int cellTypeRequested) throws ClassNotFoundException { 
    // ... 
     throw new ClassNotFoundException("cellType Not Available"); 
    // ... 
    return cellClassRequired; 
} 

這是除java.lang.RuntimeException及其子類之外的任何Exception的規則。

+0

我認爲錯誤是Throwable的子類,爲此你的最後一個陳述不會成立。 RunThread不是Throwable,而是Exception I class beleive,RuntimeException是規則的例外。 +1,因爲它回答了問題。 – Jimmy 2014-10-20 16:55:20

+0

很對,@Jimmy。我輸入得太快了。現在糾正了。 – 2014-10-20 17:03:26

0

由於ClassNotFoundExceptionchecked exception,您需要添加throws declaration。修復您的代碼,它應該是這樣的:

public Class getClassForCellType(int cellTypeRequested) throws ClassNotFoundException { 

    Class cellClassRequired = null; 

    if (cellTypeRequested == 0) { 
     cellClassRequired = CellA.class; 
    } else if (cellTypeRequested == 1) { 
     cellClassRequired = CellB.class; 
    } else { 
     throw new ClassNotFoundException("cellType Not Available"); 
    } 

    return cellClassRequired; 
} 
+0

這正是我想避免:) – Androider 2014-10-20 16:55:13

0

在Java中,我們有兩個核心類型的異常: 檢查,檢查異常。

檢查異常:如果拋出此類異常,它必須由方法的客戶端或方法本身明確處理。 ReflectiveOperationException是一個例子。這些類型的異常通常用於反映API問題,使用問題,合法/業務應用程序故障。如果你需要在你的方法中處理(即捕獲異常),或者你必須明確地通知客戶他們可能會得到這個異常(即throws子句),那麼Java就可以滿足這個要求。

未經檢查的異常:如果拋出此類異常,則不必顯式處理。這些通常反映了編程錯誤 - 例如,ArrayIndexOutOfBoundsExceptions就是一個很好的例子 - 你不會預料到遇到這個問題,如果你這樣做了,你可以相對確信它是一個錯誤,並且不希望客戶端滿足它在他們的代碼中!


在您的示例中,您試圖告訴客戶端他們通過拋出ClassNotFoundException傳遞給您一個錯誤的參數。他們需要知道這可能是爲了處理代碼中的場景而引發的,因此您需要將throws聲明添加到方法簽名中。

public Class getClassForCellType(int cellTypeRequested) throws ClassNotFoundException { 

} 

見的Oracle文檔上多個異常教程:http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html