写点什么

去除 Java 的受检异常?

  • 2007-06-12
  • 本文字数:911 字

    阅读完需:约 3 分钟

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-06-12 01:301423
用户头像

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

关注

评论 1 条评论

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

在SaaS时代,帮助中心成为了许多企业的选择

Baklib

设计模式:里氏替代原理(LSP)

flow

签约计划第三季

数据中台建设(十一):数据中台解决方案参考与未来发展方向

Lansonli

大数据 数据中台 8月月更

云渲染平台是互联网和云计算的发展产物

Finovy Cloud

云渲染 渲染农场 渲染价格

备份和恢复Kubernetes集群中的Etcd数据

JAVA活菩萨

Java 程序员 后端 大厂技能 大厂实践

VS Code如何打造C/C++开发环境?

Jackpop

IT人才知道的二进制爱情,羡慕ing

ioik

爱情 二进制 java; 签约计划第三季

C++为什么始终无法取代 C 吗?

Jackpop

分析LED透明屏VS常规显示屏优劣

Dylan

LED LED显示屏 led显示屏厂家

如何设置跨域隔离启用 SharedArrayBuffer

JAVA活菩萨

Java 程序员 后端 大厂技能 大厂实践

技术内幕 | StarRocks Community Champion、阿里云技术专家解读 Optimizer 实现

StarRocks

数据库

Linux的难题,终于有解了!

Jackpop

文盘Rust -- 配置文件解析

京东科技开发者

数据库 rust yaml 配置文件

为什么企业需要使用 Wiki 工具?

Geek_da0866

在常州“超级虚拟工厂”,中国智造正在“原力觉醒”

脑极体

云渲染掀起虚拟演唱会新热潮

3DCAT实时渲染

华为研究院19级研究员几年心得终成趣谈网络协议文档,附大牛讲解

JAVA活菩萨

Java 程序员面试 大厂技能 秋招 大厂面经

最好的编程语言

flow

签约计划第三季

使用 Monaco Editor 开发 SQL 编辑器

CRMEB

React组件应用于Spring MVC工程

JAVA活菩萨

Java 程序员 后端 大厂技能 大厂实践

Nacos配置中心之服务端长轮询处理机制

急需上岸的小谢

8月月更

架构实战营课程学习感受

极客土豆

C++深拷贝与浅拷贝,初始化列表,对象成员,静态成员相关分析

CtrlX

8月月更

为什么互联网大厂一边疯狂裁员,一边不停招聘?

Jackpop

Docker基础:Docker 常用命令梳理

天使不哭

#开源 8月月更

理解JavaScript中的“面向对象”

珲少

Kubernetes微服务Pod 影响力

CTO技术共享

开源 Kubernetes 集群 签约计划第三季 8月月更

什么是好的应用程序?

flow

签约计划第三季

如何进行技术面试?

flow

签约计划第三季

如何编写有效的FAQ常见问题页面

Baklib

如何管理LAXCUS计算机集群

JAVA活菩萨

Java 程序员 后端 大厂技能 大厂实践

去除Java的受检异常?_Java_Geoffrey Wiseman_InfoQ精选文章