是否可以禁用Java中的Checked Exceptions?

时间:2016-11-24 20:56:43

标签: java exception checked-exceptions unchecked-exception

我正在阅读一篇关于Java中已检查和未经检查的Exceptions的文章,并发现了这篇文章/链接: https://projectlombok.org/disableCheckedExceptions.html

根据这篇文章,它只是为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 因为我正在尝试打开一个文件。在这里"抛出"条款是必须的。没有它我会得到一个错误。如果我确定我正在打开的文件存在,该怎么办? iemyfile.txt在上述位置。在某些时候,人们可以感觉到代码不需要很少的Checked Exceptions。

Java是否提供了根据需要禁用已检查的例外的工具?

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

  

Java是否提供了根据需要禁用已检查的例外的工具?

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

首先,由于java中存在已检查未经检查例外,因此使用未经检查的例外可能是一种选择。从RuntimeException派生的所有异常都是未选中的:

  

RuntimeException是那些的超类    在正常操作期间可以抛出的异常    Java虚拟机。    不需要在其抛出中声明方法    子句可能是RuntimeException的任何子类    在执行方法期间抛出但未捕获。

有趣的阅读herehere

然后有type erasure允许在不声明的情况下抛出已检查的异常 这是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的一部分。一旦你通过编译器阶段,一切皆有可能。因此,直接编写字节码或使用checked exceptions disabled的javac版本完全绕过它们。

答案 2 :(得分:0)

  

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