好奇:为什么单独使用Java需要"抛出<SomeSpecific> Exception"语法?

8 java

我们都知道这是必要的.

但是,为什么仅在Java中需要它,当具有异常处理能力的其他类似语言不需要我们编写"抛出异常"时?是否有人知道Java语言设计时发生了什么以及为什么他们这样做?只是好奇.

PS这可能不是一个实际或非常必要的问题 - 无论如何,我对正在进行的项目可能无法帮助我.但某些语言特征激起了我的好奇心:D

编辑 看起来我的问题非常模糊!我想我错误地说了这个问题.在处理Java代码时,我们需要在编程期间的某些点使用"抛出异常"类型的语法.但是在C#或C++甚至VB.Net和PHP中都不需要类似的东西.那么为什么Java一直坚持这个呢?

Dan*_*den 11

正如此处的其他答案所指出的那样,throws只有经过检查的异常才需要该子句,这是目前只存在于Java中的一个特性.

关于Java 为什么检查异常的官方答案已有详细记录:

为什么设计者决定强制一个方法来指定可以在其范围内抛出的所有未捕获的已检查异常?方法抛出的任何异常都是方法的公共编程接口的一部分.那些调用方法的人必须知道方法可以抛出的异常,以便他们可以决定如何处理它们.这些异常与该方法的编程接口一样,也是其参数和返回值的一部分.

但是,即使在Java社区内,这一决定仍然存在很大争议:

最近,包括布鲁斯·埃克尔和罗德·约翰逊在内的几位备受好评的专家公开表示,虽然他们最初完全同意关于检查例外的正统立场,但他们得出的结论是,对经过检查的例外的独家使用不是一个好主意.最初出现,并且检查异常已成为许多大型项目的重要问题来源.Eckel采取了更极端的观点,暗示所有例外情况都应该不加以控制; 约翰逊的观点更为保守,但仍然表明对正式例外的正统偏好是过度的.(值得注意的是,C#的架构师,几乎肯定有使用Java技术的丰富经验,选择省略语言设计中的检查异常,使所有例外未经检查的例外.但是,他们确实为以后执行检查的例外留出了空间.)

就个人而言,我发现只有当你的API习惯于捕获所有异常并将它们作为适合你的抽象层的东西重新抛出时,才会发现已检查的异常是有用的.例如,碰巧使用磁盘或SQL后端来缓存数据的内存中对象缓存应该永远不会抛出- IOException或者SQLException- 它应该抛出(并声明)一些用户定义的异常,如CacheFailureException或类似的.

此外,你可能会发现Ned Batchelder的文章"热带雨林中例外"对这个问题有所启发.