是否可以在Java中禁用已检查异常?

是否可以在Java中禁用已检查异常?,java,exception,checked-exceptions,unchecked-exception,Java,Exception,Checked Exceptions,Unchecked Exception,我读了一篇关于Java中检查和未检查异常的文章,发现了这篇文章/链接: 根据这篇文章,这只是为javac开发的一个黑客程序 考虑下面的代码片段: import java.io.*; class Example { public static void main(String args[]) throws IOException { FileInputStream fis = null; fis = new FileInputStream("m

我读了一篇关于Java中检查和未检查异常的文章,发现了这篇文章/链接:

根据这篇文章,这只是为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();    
    }
}
这里我必须编写
publicstaticvoidmain(stringargs[])抛出IOException
因为我正试图打开一个文件。这里的“抛出”条款是必须的。没有它,我会出错。如果我确信我正在打开的文件存在该怎么办。i、 e.myfile.txt在提到的位置。在某种程度上,我们可以感觉到代码不需要几个已检查的异常

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


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

除了破解编译器之外,我知道没有任何选项可以禁用选中的异常。如果您不想强制客户端代码处理选中的异常,那么最好捕获选中的异常并在运行时异常中重新显示它

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

没有官方设施,但在需要时可以使用以下变通方法:

首先,由于java中同时存在选中的未选中的异常,因此使用未选中的异常可能是一种选择。从RuntimeException派生的所有异常均未选中:

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

有趣的阅读

然后是一个允许在不声明的情况下抛出已检查异常的方法。
这就是lombok项目的用途

小心使用:

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

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

将编译器插件与
异常
插件选项一起使用。它有效地消除已检查的异常。使用此选项,选中的异常的行为与未选中的异常类似。不再有编译器错误,不再有样板文件try/catch/wrap/rethrow胡说八道。使用Java8-12


在编写软件时,你永远无法确定某件事是否如你所想。因此,如果出现问题,您应该始终抛出异常。为什么要禁用它们?如果一切正常,它将永远不会被抛出。在其他情况下,它应该被抛出,并且您不应该禁用它们。您现在可以确定,但是如果该文件位置将更改或不可用(如光盘/文件系统损坏),该怎么办?Java在这种情况下应该如何反应?它从
newfileinputstream(“myfile.txt”)得到异常但它不能用它做任何事情。。。您的代码应该如何进行?它是否应该更进一步,干脆忽略任何例外情况?这是自找麻烦。你怎么能肯定?我的回答是:你不应该。检查异常来自libs,用于告诉程序员某些错误需要恢复。程序员可以决定是否可以通过逻辑恢复错误,或者是否需要通知程序用户,或者要求他们做出决定。如果关闭选中的异常,则决定忽略该错误。这类程序最近刚刚使ExoMars着陆器Schiapareli坠毁。例如,有一些工具和库可以简化事情,但其中的文本也涵盖了为什么这是“有争议的”。
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();
  }
}