如何区分Programmer和JVM Exceptions

Hax*_*xed 8 java exception



正如标题所暗示的,如何从编程方式(这是否意味着,由程序员或程序抛出)抛出异常来告诉JVM 抛出异常


JVM例外


1) ArrayIndexOutOfBoundsException

2) ClassCastException

3) NullPointerException



以编程方式抛出


1) NumberFormatException

2) AssertionError


非常感谢

Jus*_*ini 5

我不确定你所说的 JVM 异常是什么意思。这些都是程序员可能在任何时候抛出的运行时异常(异常AssertionError),尽管抛出某些异常(例如NullPointerException. 关键是,除了它们的典型用法之外,没有任何一种质量可以区分您提到的两个类别。所有运行时异常都直接或间接扩展RuntimeException.

来自 JavaDocs Throwable

只有属于该类(或其子类之一)实例的对象才会被 Java 虚拟机抛出或者可以被 Java throw 语句抛出。

由于同一个超类定义了 JVM 或程序员抛出的所有异常,因此您无法轻松地区分这两者。

  • “...抛出某些异常(如 NullPointerException)的糟糕风格”——这是错误的。如果您编写接受指针的 API,则应确保在 API 创建任何“副作用”之前尽早检查指针的有效性。这可能包括检查指针是否为空并显式抛出异常(如果在执行过程中不会隐式进行检查)。 (2认同)

Ste*_*n C 5

你不能静态地这样做,因为不存在这样的区别.

应用程序或第三方库代码可能会抛出标准Java类库中定义的任何异常.在某些情况下,抛出标准异常是一个糟糕的(甚至是可怕的)想法,但在其他情况下,这是建议的事情.

区分JVM和应用程序代码抛出的异常的唯一可能方法是检查抛出异常中的堆栈帧,以确定实例化异常的类.(严格地说,这并没有告诉你抛出异常的位置......但是它很接近,因为异常几乎总是被实例化并抛出在同一个语句中.)

但即便如此,这也不是特别有用的事情.我的意思是,应用程序代码抛出的异常和类库之间的语义差异是什么?它当然没有说明问题的根本原因.