为什么运行时异常在Java代码中称为运行时异常?

时间:2018-02-22 21:16:13

标签: java exception

Java代码有编译时和运行时。有检查的异常和未经检查的异常。检查异常和未经检查的异常都在运行时发生。

尽管如此,未经检查的异常的基类不会被称为UncheckedException而是RuntimeException。这不是直接的直观。

我们如何从逻辑的角度来访问名称的选择?为什么不只是调用UncheckedException和CheckedException?

一旦理解了名称选择背后的逻辑,就可以更轻松地使用它。

4 个答案:

答案 0 :(得分:2)

RuntimeException的Javadoc说:

  

RuntimeException是在Java虚拟机的正常操作期间可以抛出的那些异常的超类

它被称为" Runtime"因为它是 运行时系统",即 Java虚拟机的异常超类和运行时库

它不是关于"在运行时",而是关于"运行时系统"。

例外是JVM可以生成的例外,例如NullPointerExceptionArrayIndexOutOfBoundsExceptionNegativeArraySizeExceptionArrayStoreExceptionArithmeticException以及常见例外来自"运行时库"通常不会被捕获(未经检查的例外),例如IllegalArgumentException NoSuchElementException等。

答案 1 :(得分:1)

编译时异常不是例外,它是代码中的错误。

Throwable是所有例外的最高点。在Throwable下面你有错误和异常。在Exception下面你有RuntimeException。

Java有两种类型的例外 - 已选中和未选中。检查的异常由编译器强制执行(您必须在throws子句中声明它们并最终捕获它们)。对于在throws子句中捕获或声明,不会强制执行未经检查的异常。

存在Throwable,因此所有异常类型都有父级。你永远不应该声明你扔掉了Throwable并且永远不会抓住它(除非你真的真的知道你在做什么)。

存在错误,表示运行时环境存在问题,程序可能无法从中恢复,例如格式错误的类文件或内存不足的VM。除非你真的知道自己在做什么,否则不应该发现错误。

异常作为所有非程序员错误的根存在(请参阅RuntimeException以了解“异常”),例如由于磁盘已满而无法创建文件。你不应该抛出,抛出或捕获异常。如果你必须捕捉异常,请确保你知道你在做什么。

存在RuntimeException以指示所有程序员错误,例如超过数组末尾或调用null对象上的方法。这些是你应该修复的东西,这样它们就不会抛出异常 - 这表明你,程序员,搞砸了代码。除非你知道自己在做什么,否则你不应该抓住这些。

阅读:https://docs.oracle.com/javase/tutorial/essential/exceptions/

答案 2 :(得分:1)

编译器没有默认指令或算法来处理运行时异常。这就是为什么它被称为运行时间例外。

答案 3 :(得分:1)

  

这只是一个不幸的名字选择吗?

这只是区分它们的一种方式。

已检查且未检查的异常来自同一基类:Exception 在编译时检查RuntimeExceptionRuntime不是。{ RuntimeException前缀表示Exception被设计为在运行时处抛出,而客户端代码不需要在编译时处理它们。

正如我在评论中所说的那样:UnCheckedException<table> <tr> <td>Column 0</td> <td>Column 1</td> <td>Column 2</td> <td>Column 3</td> <td>Column 4</td> </tr> <tr> <td>Column 0</td> <td>Column 1</td> <td>Column 2</td> <td>Column 3</td> <td>Column 4</td> </tr> <tr> <td colspan="5">Separator Text</td> </tr> <tr> <td>Column 0</td> <td>Column 1</td> <td>Column 2</td> <td>Column 3</td> <td>Column 4</td> </tr> </table> 会更自然,因为我们在谈论它们时经常会引用已检查和未经检查的异常。现在,事情已经很长时间了,API无法修改和替换。