Java设计出checked exception有必要吗( 五 )


其实很多弊端题主在问题里也说了,这是我以前看一个人说的:
At the beginning you feel safer with them, but later they prevent you from swimming quickly.“一开始你会觉得这么玩很安全,但是时间长了,你会觉得这么搞让你没法游的更快。“
尤其是到了java 8的时代,在使用lambda和streams的时候,checked exception就变得十分的讨厌。本来可以简单写成一行的调用,为了一个checked exception,就要加入try/catch。所以现在有人就建议不在public method的签名中声明任何checked exception。(如果你熟悉java的历史,其实就在几年前我们还是鼓励checked exception用在public方法的签名中的,而unchecked exception一般用在私有逻辑中,所以现在是调换过来了。)
但为了兼容以前的设计接口,我们还是难免会遇到checked exception。其中一个的做法是把checked exception包在一个runtime exception再往上仍。不过这里还有更高明的做法:
Why Try? Better Exception Handling in Java With Try - DZone Java就像我很久以前的一个回答中说的,你还可以利用Try\u0026lt;T\u0026gt;来设计成不throw任何exception的方式。上次就有一帮大兄弟出来批评,说throw/try/catch怎么怎么好,怎么没问题。这些东西都是有利有弊,我这次也不细说了,大家要是愿意,就自己看上面的文章吧。
当然,你也可以直接使用scala,scala在调用抛出checked exception的method的时候,并不会在编译器检查,这让scala整合java库的时候会显得非常干净和简洁。


■网友
我又来喷Java了。前排不舒适警告!主观观点警告!被喷就删评论警告!
Java这门语言感觉就是“给傻X发明的语言”,checked exception就是这种,假设用户(开发者)一定是傻X会忘了写/写错了/写不到位,所以来个语言层的强行限制。
这种例子可真不少比如:
关于指针和内存:
C++:开发者当然应该直接管理内存。
C#:可以,但没必要,一定要用的时候也可以用。
Java:傻X,还想管理内存?你会管吗?你管得了吗??
关于自定义数据类型:
C++:最基础的分配(struct, class, union),至于怎么往内存里塞参照上一条。
C#:不同写法不同用途,便于区分,灵活性低些但是可读性更高。
Java:傻X,乖乖new class去吧。
关于模板/泛型:
C++模板:编译生成,最大化自由与风险。
C#泛型:有基础的类型限制,比模板轻量一些。
Java:傻X,有就行了,好用不好用不关我事。
关于运算符重载/语法定制:
C++:你能想到的都能重载,重载不了的一手宏定义,完全自己定制语言功能。
C#:能进行部分定制,但要受高级语言标准限制。
Java:傻X,乖乖的get set去吧!
再来回到问题,“会造成不必要的代码臃肿和可读性降低”,“完全可以在编译出错的时候,通过单元测试和调试,得到正确的代码”,拜托啊,完全可以的事情多得是,能避免的不必要的也多得是。
Java:我就不我就不~你气不气~~气不气~~~我恶心死你气不气~~

■网友
Thinking in Java的观点也是说checked Exception应该去除的,我记得大意是说:
受检异常要求客户端程序员必须处理异常,但是程序员未必能够知道如何处理受检异常,而且从异常中恢复其实挺困难的,强迫程序员去处理的话是不现实的。
受检异常会逼迫程序员编写什么也不做的代码来“处理”它,这会导致“吞食则有害”的问题。虽然吞掉后代码能通过编译,但是除非程序员记得检查和改正代码,否则会导致异常消失。
如果你不知道如何处理受检异常,又被迫要去处理的话,Thinking in Java提出了两个方法,一个是把异常传递给控制台(这个一般是个人编写简单程序时可用);另一个是捕获checked Exception之后重新抛出unchecked Exception,使用异常链可以让原本checked Exception的信息不丢失。


推荐阅读