为什么RuntimeException扩展Exception而不是其他方式?

时间:2016-06-16 16:01:33

标签: java exception

我可以想象我想要只捕获已检查的异常而不是未经检查的异常的情况。我无法想象以其他方式做到这一点。

4 个答案:

答案 0 :(得分:5)

必须再次捕获或抛出已检查的异常,否则您的代码将无法编译。因此,在整个代码中,您必须明确地处理它们中的每一个(抛出或捕获)。

为什么只有经过检查的例外情况没有共同的父母:

他们希望你明确地处理每一个。

考虑自己编写一个方法,并使此方法抛出一个已检查的异常。当你这样做时,你希望方法的用户使用此异常的代码显式处理此异常(如果你不关心处理异常的函数的用户,你将抛出运行时异常(未选中))。

因此,检查异常的整个想法是函数创建者和用户之间的契约,它强制用户处理此异常。

答案 1 :(得分:2)

我会尽量给你一个非常精确的答案,因为我希望你已经了解checked vs non-checked exceptions。 现在回答你的问题,答案很简单,RuntimeException也是一个例外,所以它在逻辑上和设计上都是正确的。我们知道Java是OOPs原则的基础语言,所以这里基本上是继承。运行时异常具有Exception类中的所有功能,除了它已从其父级重写异常处理行为,这是其未经检查的行为。已检查的异常和未经检查的异常只是它们处理的方式不同,但是Java中的Exception的其余属性对于两者都是相同的。所以我要说的是简单的OOP设计(继承原则),两者之间的关系在逻辑上是正确的。

使用ExceptionError类可以观察到同样的事情,现在如果我们在Java中讨论这两个的含义那么异常是你可以恢复或处理的东西,但错误是你的事情无法恢复,从任何错误中恢复的唯一方法是重新启动应用程序。但是再次你会看到两者都在扩展Throwable类,因为两者都具有相同的属性,两者都可以抛出,但是它们的处理方式不同,一个可以处理,而另一个则不能,这就是为什么我们有一个Exception hierarchy,另一个是Error hierarchy

enter image description here

为了你的问题,我会说它的OOP设计,RuntimeException继承自Exception类,这在逻辑上是正确的,即使我是Java中异常的开发者,那么我也应该以相同的方式设计这些类这已经是。

希望这可能是你问题的答案。

答案 2 :(得分:2)

java是compiled and interpreted语言

  • Java compiled byte code compilation JVM
  • 相反,字节代码必须由运行时interpreted解释才能执行。

所以这就是为什么检查和取消选中的例外情况,你不能编译,你不能看到Unchecked(未经检查的例外发生在这里)部分。

java异常层次结构

java exception hierarchy

Exception Java 中的异常(我们只讨论NOT verified during Compile time层次结构)是那些处理为Unchecked异常。出现这些异常是因为编程错误。该程序不会给出编译错误。所有{ "type": "file", "enabled": true, "connection": "hdfs://10.207.78.21:38234", "config": null, "workspaces": { "root": { "location": "/", "writable": false, "defaultInputFormat": null }, "tmp": { "location": "/tmp", "writable": true, "defaultInputFormat": null } }, "formats": ... 例外都是 RuntimeException 类的直接子类。

enter image description here

答案 3 :(得分:0)

在设计API时,开发人员需要考虑所有条件。因为Exception被认为是偏离程序的实际流程。所以他们(参与设计Java API的开发人员)将条件划分为不同的类别。可以在编译时处理的一个,他们(开发人员)必须强制使用此API的人员仅在编译时处理。和其他你不能期望的,他们需要在运行时处理(运行时/未检查的异常)和一些无法处理的(错误) 。

让我们举一个例子,我们正在设计一个应用程序,因为我们需要上传一个文件。我们正在使用JAVA,所以在这种情况下我们可以使用文件输入流来提供我们需要上传/下载的文件的路径。开发人员使用Java预定义函数(文件输入/输出流)作为文件输入/输出流抛出文件未找到异常,因此编译器将使开发人员在编译时自己处理它们,如果此应用程序的最终用户想要上传文件,如果他提供了一个不可用的路径或错误的路径,则发生该异常并通过提供文件不可用的消息进行处理,然后最终用户可以轻松处理。假设用户正在使用计算器应用程序,开发人员将不知道最终用户将给出什么样的输入,因此他将尝试在运行时处理,如果他将任何数字除以零,那么我们将告诉他该操作无法完成或者当我们得到算术异常时无穷大,所以你需要改变输入本身,这是在提交值并完成除法操作后的运行时发生的。