当前位置: 首页 > 面试题库 >

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

子车成和
2023-03-14
问题内容

我正在阅读有关Java中已检查和未检查的异常的文章,并找到此文章/链接: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
因为我试图打开一个文件。在这里,“
throws”子句是必须的。没有它,我会得到一个错误。如果我确定要打开的文件的存在怎么办。提到的位置中的iemyfile.txt。在某些时候,您可能会觉得代码不需要检查异常。

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

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


问题答案:

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

没有官方的设施,但是有一些变通办法可以在需要时使用:

首先,由于有两个 检查未经检查
的Java异常,使用unchecked异常可能是一种选择。未检查所有源自RuntimeException的异常:

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

有趣的阅读在这里,在这里。

然后是类型擦除,它允许在不声明它的情况下抛出一个检查的异常。
这就是龙目岛用于@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版本会完全绕开它们。



 类似资料:
  • 我正在开发一个使用JBoss RESTEasy(RESTEasy-jaxrs-3.0.8)的Web应用程序,但我想禁用RoleBasedSecurityFilter。java,只使用我自己的自定义类(它也实现,就像类一样,它们都是安全过滤器)。 这样做的原因是RoleBasedSecurityFilter.java的第43行调用了一个isUserInRole()方法,该方法在我的应用程序中总是返回

  • 问题内容: 是否可以在tomcat的URL中关闭jsessionid?jsessionid似乎对搜索引擎不太友好。 问题答案: 你可以使用此过滤器仅对搜索引擎禁用,但我建议对所有响应都使用它,因为它比不友好的搜索引擎更糟糕。它公开了可用于某些安全漏洞的会话ID(更多信息)。 Tomcat 6(6.0.30之前的版本) 你可以使用tuckey重写过滤器。 Tuckey过滤器的示例配置: Tomcat

  • 问题内容: 我使用OSGI,这是我要禁用模块的主要原因,因为我真的不需要其他模块框架。是否可以这样做,例如使用命令行选项?如果是,那怎么办? 问题答案: 没有关闭模块系统的选项-它将始终处于活动状态。这会影响对JDK内部API的访问,对Java EE模块的依赖,Split软件包以及许多其他小细节 。如果您希望应用程序在Java 9上运行,则代码和依赖项必须应对这些迁移挑战。 但是,您绝不被迫创建模

  • 本文解释了如何禁用urllib3中的警告,但我使用的是带有请求模块的对象。出现警告是因为(ssl)参数设置为,以便访问页。 例如。

  • 问题内容: 是否可以在不完全禁用JavaScript的情况下禁用AJAX? 问题答案: 如果您使用的是Firefox,则可以使用GreaseMonkey完成此操作。(https://addons.mozilla.org/en- US/firefox/addon/748 ) GM是用于将脚本应用于您访问的部分或全部页面的框架。我有禁用google- analytics下载的GM脚本(因为它们会使速度

  • 对于一些网站,当我按F12按钮看到html元素,什么都没发生。为什么啊?我通过ie和谷歌chrome测试它。有什么工具可以看到这个网站的元素和媒体吗?