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

Nav*_*Neo 5 java exception checked-exceptions unchecked-exception

我正在阅读有关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();    
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里我必须写, public static void main(String args[]) throws IOException 因为我正在尝试打开文件。在这里,“ throws”子句是必须的。没有它,我会得到一个错误。如果我确定要打开的文件的存在怎么办。提到的位置中的iemyfile.txt。在某些时候,您可能会觉得代码不需要检查异常。

Java是否提供了根据需要禁用检查异常的功能?

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

lem*_*eze 2

Java 是否提供了根据需要禁用检查异常的功能?

没有官方设施,但有需要时可以使用的解决方法:

首先,由于 java 中同时存在检查异常非检查异常,因此使用非检查异常可能是一种选择。所有从 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();
  }
}
Run Code Online (Sandbox Code Playgroud)

谨慎使用:

请注意,不可能直接捕获偷偷抛出的检查类型,因为 javac 不会让您为 try 主体中没有方法调用声明为抛出的异常类型编写 catch 块。

最后,只有编译器关心检查异常,它根本不是 jvm 的一部分。一旦过了编译器阶段,一切皆有可能。因此,直接编写字节码或使用禁用检查异常的 javac 版本完全绕过它们。