2016-11-24 80 views
1

我讀到關於Java的檢查和unchecked異常的文章,發現這篇文章/鏈接: https://projectlombok.org/disableCheckedExceptions.html禁用Java中的Checked Exceptions可能嗎?

根據它只是用於javac開發的破解文章。

考慮下面的代碼片段:

import java.io.*; 
class Example 
{ 
    public static void main(String args[]) throws IOException 
    { 
     FileInputStream fis = null; 
     fis = new FileInputStream("myfile.txt"); 
     int k; 

     while((k = fis.read()) != -1) 
     { 
      System.out.print((char)k); 
     } 
     fis.close();  
    } 
} 

在這裏,我必須寫public static void main(String args[]) throws IOException 因爲我試圖打開一個文件。這裏「拋出」條款是必須的。沒有它,我會得到一個錯誤。如果我確信我正在打開的文件存在,該怎麼辦?即提到的位置中的myfile.txt。在某些時候,人們可以感覺到代碼中不需要很少的檢查異常。

是否有Java提供的任何設施根據需要禁用檢查異常?

即使做了這麼多的研究,我找不到適當的答案。

+0

當你寫軟件你永遠不知道,那事實就像你想象的那樣。所以如果出現問題,你應該拋出異常。爲什麼你想禁用它們,如果一切都很好,在別的情況下它不會被拋出,你不應該拋出它們 –

+2

現在你可能確定,但​​是如果該文件位置將會改變或將不可用如通過光盤/文件系統損壞)? Java如何在這種情況下做出反應?它從'new FileInputStream(「myfile.txt」)中得到了異常,'但是它對它無能爲力......你的代碼應該如何繼續?它應該走得更遠,而忽略任何異常?這是在尋求麻煩。 – Pshemo

+0

你怎麼確定? – njzk2

回答

1

Java是否有任何設施根據需要禁用checked異常?

沒有官方的設施,但也有變通方法需要的時候可以使用:

首先,由於有兩個檢查選中異常在Java中,使用unchecked異常可能是一種選擇。從RuntimeException的派生的所有異常是未經檢查:

RuntimeException的是那些 例外,可以在 Java虛擬機的正常運行期間拋出的超類。 一個方法不需要在其拋出的 子句中聲明RuntimeException的任何子類,該子類可能在執行該方法期間拋出 但未捕獲。

有趣的讀取herehere

然後有type erasure它允許拋出一個檢查的異常,而無需聲明它。
這是項目龍目島用來@SneakyThrows

import lombok.SneakyThrows; 

public class SneakyThrowsExample implements Runnable { 
    @SneakyThrows(UnsupportedEncodingException.class) 
    public String utf8ToString(byte[] bytes) { 
    return new String(bytes, "UTF-8"); 
    } 

    @SneakyThrows 
    public void run() { 
    throw new Throwable(); 
    } 
} 

使用謹慎:

要知道,這是不可能追上悄悄泛起直接檢查類型,javac的不會讓你寫一個catch阻止try體內沒有方法調用聲明爲拋出的異常類型。

最後它只是關心檢查異常的編譯器,它根本不是jvm的一部分。一旦你經歷了編譯器階段,任何事情都是可能的。所以直接編寫字節碼或者使用帶有checked exceptions disabled的javac版本完全繞過它們。

1

除了黑客編譯器之外,沒有選項可以禁用我知道的檢查異常。如果您不想強制客戶端代碼處理檢查的異常,最好做的就是捕獲檢查的異常,並在運行時異常中重新拋出異常。

0

Java是否有任何設施根據需要禁用檢查異常 ?

不,您不能禁用檢查的異常,因爲它們是爲了某個目的。

當發生異常時(如代碼爲IOException)在代碼中提供恢復機制時,檢查異常將會很有幫助。此外,他們會讓你意識到/確保有可能通過執行一些代碼來獲得異常,並且可以相應地採取適當的行動。

這編譯時檢查異常處理程序的存在 旨在減少例外,沒有正確的處理 的數量。

我建議你看看here以更好地理解。