Java中已检查和未检查的异常

Java有两种类型的异常-已检查和未检查。 简而言之,选中的是指开发人员可以从异常中合理恢复的情况,而未选中的异常是无法处理的编程错误。 本文介绍了何时使用哪种。

但这不是那么简单–受检查的异常使代码变得“丑陋”。 它们迫使开发人员编写try / catch块或重新抛出异常。 但是重新抛出隐藏了另一个问题–一些异常不应跨越模块边界。 当您不知道要做什么时,被迫捕获一个已检查的异常时,最常见的做法是将其包装在RuntimeException中并重新抛出。

实际上,这可能不是最常见的-尤其是新手程序员倾向于吞下带有空catch块的异常。 如果存在一些用于异常处理的常规层,则日志和重新抛出有时会导致堆栈跟踪加倍。 无论如何,这里有多种不良做法,导致难以调试和维护的代码。

有人说,鉴于检查过的异常所带来的冗长,繁琐和容易出错,应该彻底消除它们。 C#根本没有检查过的异常。 当然,消除它们应该考虑向后兼容性。

但是,我认为拥有这两种例外的决定具有其优点。 它迫使开发人员认为在这种情况下可能会发生异常,因此他必须采取措施。 API声明它将抛出异常,并且开发人员将看到此编译时 。 它增强了编译时的安全性。 您不应该等到代码投入生产后才发现可能会失败。 Javadoc? 好吧,这是一个不错的选择,但是我敢打赌,直到异常发生之前,没有人会阅读javadoc。

那么,如何拥有“两全其美”呢? 我有一个奇怪的想法( 请在此处详细说明 ),使API定义两个接口(通过继承链接,因此实际上仅支持一个接口),并提供一种通过工厂获得方法的方法,该实现的方法被检查异常,或将检查的异常包装为未检查的异常。 我不知道这可能是可行的,也可能是愚蠢的。 现在,它看起来很奇怪。

但是以上只是一个解决方法。 然后另一个想法来了–在方法上引入@RethrowExceptions批注。 它会告诉编译器,在此方法中,您不想处理已检查的异常,但也不想声明将其抛出。 (注释的名称可以改进)。 在我想到的最简单的实现中,这可以简单地告诉编译器使用try {..} catch (Exception ex) { throw new RuntimeException(ex);}包围整个方法主体。 好处:

  • 编译器仍然警告您使用的方法可能会引发异常,因此您必须考虑处理它
  • 通过不必要的尝试/捕获,您不会使代码变得丑陋。 而且您不会强迫呼叫者考虑如何处理例外情况
  • 吞下异常的可能性降低了。

简而言之,这样的注释会将方法标记为无法处理异常并且不希望将此决定传播给调用者的方法。

这个想法听起来不那么奇怪。 我猜它现在甚至可以使用编译器插件来实现。 还是已经在lombok项目中实现了?

别忘了分享!

参考: Bozho的技术博客博客中的JCG合作伙伴 Bozhidar Bozhanov提供的 Java中的Checked和Unchecked异常 。


翻译自: https://www.javacodegeeks.com/2012/09/checked-and-unchecked-exceptions-in-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CCF - 201403-3 - 命令行选项

问题描述 试题编号:201403-3试题名称:命令行选项时间限制:1.0s内存限制:256.0MB问题描述: 问题描述请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空…

java 枚举 values_JAVA 枚举运用一 values方法

importjava.lang.reflect.Method;importjava.lang.reflect.Type;importjava.util.Set;import java.util.*;public classEnumJavaClass {public enumEnumClass{One("参数变量枚举一"),Two("参数变量枚举二"),Three("参数变量枚举三");privateStri…

telnet测试端口是否正常打开

点击计算机的开始菜单--》运行 ,输入CMD命令,然后确定。打开cmd命令行。 输入telnet测试端口命令: telnet IP 端口 或者 telnet 域名 端口 回车 如果端口关闭或者无法连接,则显示不能打开到主机的链接,链接失败 端口…

Linux历史,安装,分区,版本

Linux 历史 1970年是 UNIX元年,这一年 Kenneth Lane Thompson 和 Dennis Ritchie 合作编写了UNIX系统。Stallman 发起了GNU 计划,他本人开发了Emacs, GCC, GDB.Minix:教学用的类UNIX系统,由于UNIX是收费的且价格昂贵,因…

放弃Eclipse Juno

在上一个博客中,我发布了有关Eclipse 4.2 Juno设置的信息。 万一我需要重新安装其他东西,也可以作为参考。 当时我没有谈论的是我与Juno共同遇到的问题。 我以为这是我自己的安装程序,很麻烦,但是此后并没有太大改善。 我遇到的主…

Java instead of 用法_我又不是你的谁--java instanceof操作符用法揭秘

背景故事《曾经最美》是朱铭捷演唱的一首歌曲,由陈佳明填词,叶良俊谱曲,是电视剧《水晶之恋》的主题曲。歌曲时长4分28秒。 歌曲歌词:看不穿你的眼睛藏有多少悲和喜像冰雪细腻又如此透明仿佛片刻就要老去整个城市的孤寂不止一个你…

3.26

http://codeforces.com/gym/101196/attachments A题 B题 题意:一群人玩桌上足球(>4人),分成黑白两队,每队有进攻和防守两名玩家,如果有一方失败则失败方的防守坐到等候席的结尾、进攻被流放到防守区再上来一个人作为进攻方。而…

scala akka通信机制

https://www.2cto.com/kf/201701/587514.html转载于:https://www.cnblogs.com/rocky-AGE-24/p/7542874.html

JUnit通过失败测试案例

为什么要建立一种预期测试失败的机制? 有一段时间,人们会希望并期望JUnit Test案例失败。 尽管这种情况很少见,但确实发生了。 我需要检测JUnit测试何时失败,然后(如果期望的话)通过而不是失败。 具体情况是…

CentOS6.5安装MySQL5.7详细教程

CentOS6.5安装MySQL5.7详细教程 注:文中所写的安装过程均在CentOS6.5 x86下通过测试 主要参考博文: https://segmentfault.com/a/1190000003049498 http://www.th7.cn/db/mysql/201601/175073.shtml 1.检测系统是否已经安装过mysql或其依赖,若…

cmake 查看编译命令,以及在vscode中如何使用cmke

通过设置如下配置选项,可以生成compile_commands.json 文件,记录使用的编译命令 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)获得现有模块列表 cmake --help-module-list查看命令文档 cmake --help-command find_file查看模块的详细信息 cmake --help-mo…

php学习八:封装

一:在php中,用class关键字来创建一个类,即进行封装;在类里面有成员属性和方法行为组成: 1.成员属性:用关键字var来声明,可以给初始值也可以不给;现在var废弃,用public来声明,public为共有属性&a…

纯Java JavaFX 2.0菜单

在有关JavaFX的最新文章中 ,我集中讨论了不使用JavaFX 1.x的JavaFXScript和不使用JavaFX 2.0的新FXML来使用JavaFX 2.0的新Java API 。 所有这些示例均已使用标准Java编译器进行了编译,并使用标准Java启动 器执行。 在本文中,我将继续演示使用…

设置QtreeWidget水平滚动条

转载请注明出处:http://www.cnblogs.com/dachen408/p/7552603.html //设置treewidget水平滚动条 ui.treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);ui.treeWidget->header()->setStretchLastSection(false);转载于:https…

java 序列化 uid,Java中的序列化版本uid

How is Serialization id stored in the instance of the object ?The Serialization id we declare in Java is static field;and static fields are not serialized.There should be some way to store the static final field then. How does java do it ?解决方案The ser…

HTML5本地存储

什么是Web Storage Web Storage是HTML5里面引入的一个类似于cookie的本地存储功能,可以用于客户端的本地存储,其相对于cookie来说有以下几点优势: 存储空间大:cookie只有4KB的存储空间,而Web Storage在官方建议中为每个…

番石榴秒表

番石榴的秒表是番石榴第10版的另一个新番石榴类(作为Optional ,这是另一篇近期文章的主题)。 顾名思义,这个简单的类提供了一种方便地测量两个代码点之间经过的时间的方法。 与使用System.currentTimeMillis(&#xff…

CF 839 E-最大团

CF 839 E Soltion: 就是怎么求最大团的问题: 以下是\(O(7000\times n^2)\)的做法 求一个最大团,然后将所有的药水平均分配,到最大团的所有点上,计算答案. #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorit…

sse java_SSE详解

SSE(Server-Sent Events):通俗解释起来就是一种基于HTTP的&#xff0c;以流的形式由服务端持续向客户端发送数据的技术应用场景由于HTTP是无状态的传输协议,每次请求需由客户端向服务端建立连接,HTTPS还需要交换秘钥&#xff0c;所以一次请求,建立连接的过程占了很大比例在http…

520. Detect Capital

题目&#xff1a; Given a word, you need to judge whether the usage of capitals in it is right or not. We define the usage of capitals in a word to be right when one of the following cases holds: All letters in this word are capitals, like "USA".A…