簡體   English   中英

是否可以在Java中禁用Checked Exception?

[英]Is disabling Checked Exceptions in Java possible?

我正在閱讀有關Java中已檢查和未檢查的異常的文章,並找到此文章/鏈接: https : //projectlombok.org/disableCheckedExceptions.html

根據這篇文章,這只是為javac開發的一種hack。

考慮下面的代碼片段:

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因為我正在嘗試打開文件。 在這里,“ throws”子句是必須的。 沒有它,我會得到一個錯誤。 如果我確定要打開的文件的存在怎么辦。 提到的位置中的iemyfile.txt。 在某些時候,您可能會覺得代碼不需要檢查異常。

Java是否提供了根據需要禁用檢查異常的功能?

即使做了很多研究,我也找不到合適的答案。

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

Java是否提供了根據需要禁用檢查異常的功能?

沒有官方的設施,但是有一些變通辦法可以在需要時使用:

首先,由於有托運和Java中未檢查異常,使用unchecked異常可能是一種選擇。 未檢查所有源自RuntimeException的異常:

RuntimeException是在Java虛擬機的正常操作期間可能引發的那些異常的超類。 方法不需要在其throws子句中聲明RuntimeException的任何子類,這些子類在方法執行期間可能會被拋出但未被捕獲。

有趣的是 這里讀。

然后是類型擦除 ,它允許在不聲明它的情況下拋出一個檢查的異常。
這是lombok用於@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不允許您為try主體中沒有方法調用聲明為拋出的異常類型編寫catch塊。

最后,只有編譯器關心被檢查的異常,它根本不是jvm的一部分。 一旦您經過編譯器階段,一切皆有可能。 因此,直接編寫字節碼或使用禁用檢查異常的javac版本會完全繞開它們。

Manifold編譯器插件與exceptions插件選項一起使用。 它有效地消除了檢查到的異常。 使用此選項,已檢查的異常的行為類似於未檢查的異常。 沒有更多的編譯器錯誤,沒有更多的樣板try / catch / wrap / rethrow廢話。 適用於Java 8-12。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM