Java代码有编译时和运行时。有检查的异常和未经检查的异常。检查异常和未经检查的异常都在运行时发生。
尽管如此,未经检查的异常的基类不会被称为UncheckedException而是RuntimeException。这不是直接的直观。
我们如何从逻辑的角度来访问名称的选择?为什么不只是调用UncheckedException和CheckedException?
一旦理解了名称选择背后的逻辑,就可以更轻松地使用它。
答案 0 :(得分:2)
RuntimeException
的Javadoc说:
RuntimeException
是在Java虚拟机的正常操作期间可以抛出的那些异常的超类。
它被称为" Runtime"因为它是 运行时系统",即 Java虚拟机的异常超类和运行时库。
它不是关于"在运行时",而是关于"运行时系统"。
例外是JVM可以生成的例外,例如NullPointerException
,ArrayIndexOutOfBoundsException
,NegativeArraySizeException
,ArrayStoreException
,ArithmeticException
以及常见例外来自"运行时库"通常不会被捕获(未经检查的例外),例如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
在编译时检查RuntimeException
,Runtime
不是。{
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无法修改和替换。