JVM和程序异常

时间:2012-10-21 14:27:36

标签: java

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

由于

3 个答案:

答案 0 :(得分:3)

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

还要确保区分JVM异常和JDK异常 - 标准Java库抛出的异常。没有检查JVM异常,但是有很多JDK异常。

对于选中/未选中的区别,编译器会强制您事先声明方法可能显式抛出的所有已检查异常,或者通过调用可能抛出它们的方法。没有对未经检查的例外进行此类检查。

答案 1 :(得分:1)

通过JVM异常,您可能会考虑Java VM抛出的异常,而Programmatic异常是java程序员代码抛出的异常。

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

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

答案 2 :(得分:1)

  

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

首先,“JVM例外”不是标准术语。 (事实上​​SCJP6讨论JVM抛出的异常并不能使你的术语正确。你引用的SCJP6文本正在使用描述性的词语......而不是试图定义术语。)

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

  

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

这种逻辑也没有意义。所有异常都在运行时抛出。这不是“检查”与“未检查”的意思。已检查和未检查的异常之间的真正区别是必须在方法签名中捕获或声明已检查的异常。使用未经检查的例外情况,您无需执行任何操作。

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