写点什么

去除 Java 的受检异常?

2007 年 6 月 12 日

Neal Gafter问了一个许多 Java 开发者都会问过的问题:“Java 语言和平台可以没有受检异常(Checked Exception)吗?”

他将反对受检异常的论点总结如下:

对受检异常的使用一直存有争议。许多人批评 Java 的受检异常,并把它们形容成软件工程中一次失败的试验。实际上,受检异常可能会导致 API 变得很复杂,程序跟异常检查代码混杂在一起,而这仅仅是为了通过编译器的编译。而另外一些人则认为受检异常是很好的语言特性,只是被误用了,甚至在 JDK 中也是这样。既然有这样糟糕的“专家”模范作用,我们还能期望普通的 Java 程序员能做得多好呢?

紧接着的讨论表明人们在这个话题上已两极分化,其中一些代表某种意见,比如以下观点来分别自于“匿名”、Christian Plesner Hansen、Henri 和 Cedric:

你不会知道自然状态的代码看起来是怎样的;人们捕捉根异常然后抛出六或七个特殊异常,或者使用许多异常来包含业务逻辑然后再抛出Exception,或者捕捉异常后再抛出错误代码,或者让 catch 块为空,或者捕捉NullPointerException

我是几个月前开始反对受检异常的。我报了一个 RFE(#6376696)并和 Sun 的相关人员讨论。他们对它几乎没什么兴趣,并最终将其标记为“不会 Fix”而关闭 [……] 受检异常就是不起作用。

我猜我是属于喜欢受检异常那一小拨人当中的一个 [……] 去掉受检异常会鼓励更糟糕的代码,因为当有错误出现时应用程序会直接当掉。而这样将会不再鼓励开发者对错误后果进行思考。

一定要把我算在认为受检异常对于构建大型 API 非常重要的那一边。当然,它们可能被误用,但未受检异常在许多地方同样也被过度使用了。

那么,受检异常还有用么?它究竟是一个并不是总被正确使用的好办法,还是一个应该终止的失败试验?

这也引出了一个更具普遍性的问题——从 Java 中去掉某些特性。如果我们一味地往语言中添加特性,而不删除其中的一些,那么语言只会变得越来越复杂。是不是有可能去掉某些特性,从而降低语言的复杂度,而不损害到语言本身呢?我们是不是应该去掉那些 deprecated 方法,并升级老的 API,而不用把向后兼容看得那么神圣不可侵犯呢?

继续追踪关于 Java 的未来的话题,请锁定 InfoQ 的 Java 社区

查看英文原文: Removing Checked Exceptions from Java

2007 年 6 月 12 日 01:30955
用户头像

发布了 127 篇内容, 共 37.0 次阅读, 收获喜欢 0 次。

关注

评论 1 条评论

发布
用户头像
<blockquote>使用#999这个灰色看起来比较蒙胧(Chrome,1080P显示器),我觉得可以提升一点灰度,比如#777就刚刚好,可能在4K显示器上#999效果会不错,但我没试过。
2019 年 11 月 01 日 11:22
回复
没有更多了
发现更多内容

程序员5分钟:你了解32位带符号的整型吗?

顾仲贤

程序员

微信朋友圈为什么没有阅读数?

彭宏豪95

微信 产品 产品设计

爱他,就让他走?

Selina

团队管理 领导力 团队协作

回"疫"录(4):见证历史

小天同学

疫情 回忆录 现实纪录 纪实

运维 Harbor 镜像仓库的法宝:Operator

亨利笔记

Kubernetes 容器 k8s Harbor operator

程序员5分钟:你的程序占用了多少内存?

顾仲贤

程序员

前端如何搞监控总结篇

大前端洞见

前端监控 监控 全链路监控

ZGC都出来了,你还不懂G1?

岁月安然

G1 JVM

不以涨工资为目的的技术学习,都会以失败而告终

陆陆通通

程序员 面试 涨薪

祝这些不要脸的王八蛋同行家里着火

二爷

vSphere 7融合Kubernetes,构建现代化应用的平台

亨利笔记

Kubernetes 容器 云原生 k8s vSphere

在谈判中,你有哪些属于自己的独特的方法和技巧?

Yolanda

除了负载均衡的算法,你还应该知道这些

松花皮蛋me

Java 负载均衡 分布式

死磕Java并发编程(4):happens-before是什么?JMM最最核心的概念,看完你就懂了

七哥爱编程

Java Java并发 happens-before JMM

OpenCV 在 Android 上的应用

fengzhizi715

android OpenCV 计算机视觉

世界知识产权日碎碎念

尹晓铁

成长 随笔 知识产权

回"疫"录(3):让人怀念的普通一天

小天同学

疫情 回忆录 现实纪录 纪实

别总说CMS、G1,该聊聊ZGC了

猿人谷

CMS G1 ZGC JVM

我为什么选择infoq写作平台

三爻

Golang 真的好用吗?

极客时间

golang 编程语言

像产品设计一样思考、像程序运行一样执行

水色

批注MYSQL开发规范,助你了解其背后的“道”

三石

数据库规范 规范背后的原理 白话规范

Harbor和Dragonfly双剑合璧 打造容器镜像运维新模式

亨利笔记

容器 k8s Harbor dragonfly 镜像

从【炉石传说】到矩阵运算

IT蜗壳-Tango

Python 学习 矩阵 数学

Java并发编程系列插曲——对象的内存结构

孙苏勇

Java 内存模型 面向对象 ClassLayout

程序员陪娃漫画系列——看医生

孙苏勇

生活 程序员人生 陪伴 漫画

我不是怕表错态,而是怕我会不自觉地捍卫它

池建强

个人成长

程序员都应该了解的运维知识经验

松花皮蛋me

DevOps 分布式 运维

决定我们认知深度的究竟是什么?

石君

深度思考 方法论 连接

“WHY-HOW-WHAT”这个被誉为伟大的领袖如何激励行动的黄金圈法则,非常值得大家学一学!

数列科技杨德华

思维方式

“消灭你,与你无关”——阿里巴巴的风险 | 旧文重发

赵新龙

阿里巴巴 风险 蒋凡 IPO

去除Java的受检异常?-InfoQ