0

我可以说JVM exceptions是未经检查的异常和Programmatic exceptions检查的异常吗?因为看起来JVM异常是在运行时抛出的,所以无法检查......

谢谢

4

3 回答 3

3

您所问的内容可能涉及两个不同的区别。JVM 运行时抛出的异常扩展自,Error而编程异常扩展自Exception. 未经检查的编程异常从RuntimeException. 因此,未经检查的异常有两个不同的类层次结构。请注意,JVM/程序的区别只是约定:您确实可以从 Java 代码中抛出您想要的任何异常类。

还要确保将 JVM 异常与 JDK 异常(标准 Java 库抛出的异常)区分开来。没有检查 JVM 异常,但检查了很多 JDK 异常。

至于检查/未检查的区别,编译器会强制您提前声明您的方法可能显式抛出的所有检查异常,或者通过调用可能抛出它们的方法来声明。对于未经检查的异常,不会进行此类检查。

于 2012-10-21T14:41:04.703 回答
1

对于 JVM 异常,您可能会想到 Java VM 抛出的异常,而 Programmatic 异常是 Java 程序员代码抛出的异常。

Java VM 抛出的大多数异常实际上是由 Java VM 中标准库中的 java 代码抛出的。您可以下载此 java 代码,您将看到这些库以与编写 java 程序的程序员相同的方式抛出异常。一个标准的 java 程序员也可以以同样的方式抛出同样的异常。

Java VM 也可能抛出 Java 错误。错误不是异常,但可以像异常一样被抛出和捕获。只有虚拟机应该抛出错误。

于 2012-10-21T14:35:06.863 回答
1

我可以说 JVM 异常是未经检查的异常,而编程异常是已检查的异常吗?

首先,“JVM 异常”不是标准术语。(而且 SCJP6 谈论 JVM 抛出的异常这一事实并不能使您的术语正确。您引用的 SCJP6 文本是描述性地使用这些词......而不是试图定义术语。)

您的问题的答案是否定的。许多“程序化”异常都是未经检查的。例如,NumberFormatException未选中。

因为看起来JVM异常是在运行时抛出的,所以无法检查......

这种逻辑也说不通。所有异常都在运行时抛出。这不是“已检查”与“未检查”的含义。已检查异常和未检查异常之间的真正区别在于,已检查异常必须在方法签名中捕获或声明。对于未经检查的异常,您也不必这样做。

现在碰巧 JVM 本身抛出的所有异常都是未经检查的。但这更多是关于触发异常的“事件”的性质。它们通常是某些 Java 代码中的错误或不可恢复的 JVM 故障的结果。这些不是应用程序通常可以从中恢复的东西,因此使它们不受检查只是避免了源代码中一些不必要的冗长(或更糟)。

于 2012-10-21T15:21:17.203 回答