如何区分Programmer和JVM Exceptions
正如标题所暗示的,我如何从编程方式 (这是否意味着,由程序员或程序抛出 ) 抛出exception来告诉JVM 抛出exception ?
JVM例外
1) ArrayIndexOutOfBoundsException
2) ClassCastException
3) NullPointerException
以编程方式抛出
1) NumberFormatException
2) AssertionError
非常感谢
我不确定你的JVMexception是什么意思。 这些都是程序员可能在任何时候抛出的运行时exception(exceptionAssertionError
),尽管抛出某些exception(例如NullPointerException
)被认为是不好的样式。 关键是,除了典型用法之外,没有一个品质将您提到的两个类别分开。 所有运行时exception直接或间接地扩展RuntimeException
。
来自JavaDocs for Throwable
:
只有作为此类(或其子类之一)的实例的对象才被Java虚拟机抛出,或者可以被Java throw语句抛出。
因为同一个超类定义了JVM或程序员抛出的所有exception,所以你不能轻易区分这两者。
你不能静态地这样做,因为不存在这样的区别。
应用程序或第三方库代码可能会抛出标准Java类库中定义的任何exception。 在某些情况下,抛出标准exception是一个糟糕的(甚至可怕的)想法,但在其他情况下,这是建议的事情。
区分JVM和应用程序代码抛出的exception的唯一可能方法是检查抛出exception中的堆栈帧,以确定实例化exception的类。 (严格地说,它没有告诉你抛出exception的位置……但是它很接近,因为exception几乎总是被实例化并抛出在同一个语句中。)
但即便如此,这也不是特别有用的事情。 我的意思是,应用程序代码抛出的exception和类库之间的语义差异是什么? 它当然没有说明问题的根本原因。
我不认为你会找到一个完整的列表,因为除了一些特殊情况之外,jvm和程序员发起的exception之间没有明显的区别:
- 由于内部或外部原因,VM会抛出大多数
Error
类。 一个exceptionThreadDeath,在该线程被停止时被抛出一个线程,并且是一种“hack”来让线程解除它的堆栈并退出。 - 大多数已检查的exception与导致某些操作失败的环境问题有关,但可能是可解析的,并且对JVM(IOException,SQLException,RemoteException)不致命。
- 其余的,未经检查的exception,是jvm和程序员发起的exception的组合。 例如,当方法参数不符合规范时,JDK抛出
IllegalArgumentException
。 这是JVMexception还是程序exception? 不清楚您的JVMexception定义是否包含JDK。ArrayIndexOutOfBounds
是为JVM生成的非法数组访问生成的,但也会在某些api中抛出,例如来自java.midi的Track.get。 (虽然这可以说是不好的forms,而且应该使用超类IndexOutOfBounds
代替。)