InfoQ

新闻

去除Java的受检异常?

作者 Geoffrey Wiseman译者 张凯峰 发布于 2007年6月12日 上午1时30分

社区
Java
主题
设计
标签
异常处理,
Java SE

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

4 条回复

回复

支持Checked Exception 发表人 Xiaogang Guo 发表于 2007年6月12日 下午12时27分
Re: 支持Checked Exception 发表人 凉粉 小刀 发表于 2007年6月14日 上午4时14分
反对CE 发表人 benk chou 发表于 2007年6月16日 上午11时22分
还是有的好 发表人 Leon Kennedy 发表于 2007年6月17日 下午8时3分
  1. 返回顶部

    支持Checked Exception

    2007年6月12日 下午12时27分 发表人 Xiaogang Guo

    我是属于支持Checked Exception的。编码的时候不可能每调用一个方法都去查API文档看有什么异常,Checked Exception是一个提醒,不必等到测试失败才去改。Checked Exception把可恢复的失败标记出来。总要看Stack trace才知道哪里可能失败是一件很痛苦的事情。

  2. 返回顶部

    Re: 支持Checked Exception

    2007年6月14日 上午4时14分 发表人 凉粉 小刀

    我也属于支持的行列。Checked Exception和Runtime Exception毕竟是两码事

  3. 返回顶部

    反对CE

    2007年6月16日 上午11时22分 发表人 benk chou

    >>因为当有错误出现时应用程序会直接当掉?
    会这样吗,不可以在顶层代码catch并记录一下吗,这样即可打断出异常的执行请求,又方便代码的编写,不用写一大堆bug乱飞的catch,把真正的exception烟盖掉。
    如果你有delphi的经验,就知道Checked Exeption所承诺的种种好处真是一个大笑话。

  4. 返回顶部

    还是有的好

    2007年6月17日 下午8时3分 发表人 Leon Kennedy

    一个完善的程序,其错误检查代码要占功能实现代码的1/3。
    除非能够自动化解决错误,否则还是多用点好。
    ---------
    袋鼠蛋开源动态web服务器,拥有完全自主知识产权
    www.kangaroo-egg.com

深度内容

Flex与JSON及XML的互操作

平台需要互操作性。在这篇文章中,作者仔细研究了Flex和JSON及XML的互操作性。文章也包含了使用E4X库来将XML映射到图表和表格组件的内容,还演示了如何使用as3core库来解码JSON消息。

用Qi4j进行面向组合编程

本文将简要介绍面向组合编程(COP,Composite Oriented Programming)的概念,展示它如何规避OOP存在的一些问题,并重新点燃使用可重用部件组装领域模型(Domain Model)的希望。

系统开发——新学科,新教育

一门新的计算机学科——“系统开发”,强调人性化、匠艺、设计、创意、创新和新事物的涌现,并建议用被称为“bottega”的工作室替代乏善可陈的教室。

图书聚焦:Visual Studio 2008 揭秘

Mike Snell和Lars Powers用他们最近由Sams出版的新书《Visual Studio 2008揭秘》,试图帮助大家提高开发人员的生产力。本文包括一个下载样章——第10章调试。

BPEL为何不是BPM的圣杯?

Pierre Vigneras在本文中讨论了作为标准之一的BPEL所存在的问题。Pierre先给我们大致介绍了一个简单的并行流程,接着讨论了从业者在试图以一个结构化模型为基础表达非结构化流程时遇到的一系列问题。

基于范型的多语言编程

你是否仔细思考过,为什么人们总在讨论“要正确的语言做恰当的事情”?在这篇文章中,Sadek Drobi向你解释了为什么应该在系统内部混合使用多种语言。

采访与书摘《Pro Web 2.0 Application Development with GWT》

Jeff Dwyer就关于他的新书(《Pro Web 2.0 Application Development with GWT》)、GWT1.5以及创建可搜索的Ajax应用谈了一些他的见解。

时刻准备着,迎接IT业的春天

我们需要设身处地地为客户及客户的业务本身着想,与客户同舟共济。更多创新的思路、产品和模式也同样将为IT业带来新的出路。IT业并不需要坐以待毙,在春天到来之后,市场将会更加繁荣!