如何区分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代替。)