5

我正在阅读一篇关于 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 ,因为我正在尝试打开一个文件。这里“抛出”子句是必须的。没有它我会得到一个错误。如果我确定我正在打开的文件的存在怎么办。iemyfile.txt 在提到的位置。在某些时候,人们会感觉到代码不需要很少的 Checked Exceptions。

Java 是否提供了任何工具来根据需要禁用已检查的异常?

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

4

3 回答 3

2

除了破解编译器之外,没有其他选项可以禁用我所知道的检查异常。如果您不想强制客户端代码处理已检查的异常,您可以做的最好的事情是捕获已检查的异常并在运行时异常中重新抛出它。

于 2016-11-24T21:03:58.237 回答
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();
  }
}

谨慎使用:

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

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

于 2017-05-18T21:39:25.217 回答
1

使用带有plugin 选项的Manifold编译器插件。exceptions它有效地中和了检查的异常。使用此选项,已检查异常的行为类似于未检查异常。没有更多的编译器错误,没有更多的样板 try/catch/wrap/rethrow 废话。适用于 Java 8 - 12。

于 2019-03-30T01:04:05.253 回答