如何区分Programmer和JVM Exceptions

时间:2010-05-29 04:47:03

标签: java exception



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


JVM例外


1) ArrayIndexOutOfBoundsException

2) ClassCastException

3) NullPointerException



以编程方式抛出


1) NumberFormatException

2) AssertionError


非常感谢

5 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:4)

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

来自Throwable的JavaDocs:

  

只有作为实例的对象   这个类(或其子类之一)   由Java虚拟机抛出   或者可以被Java抛出抛出   言。

因为同一个超类定义了JVM或程序员抛出的所有异常,所以你不能轻易区分这两个异常。

答案 2 :(得分:3)

我认为你不会找到一个完整的清单,因为除了一些特殊情况之外,jvm和程序员发起的异常没有明显的区别:

  • 由于内部或外部原因,VM会抛出大多数Error个类。一个异常ThreadDeath,在该线程被停止时被抛出一个线程,并且是一种“hack”让线程放松它的堆栈并退出。
  • 大多数已检查的异常与导致某些操作失败的环境问题有关,但可能是可解析的,并且对JVM(IOException,SQLException,RemoteException)不致命。
  • 其余的,未经检查的异常,是jvm和程序员发起的异常的组合。例如,当方法参数不符合规范时,JDK会抛出IllegalArgumentException。这是JVM异常还是程序异常?不清楚您的JVM异常定义是否包含JDK。为JVM生成的非法数组访问生成ArrayIndexOutOfBounds,但它也被抛入某些api,例如来自java.midi的Track.get。 (虽然这可以被认为是不好的形式,而且应该使用超类IndexOutOfBounds代替。)

答案 3 :(得分:0)

JVM和API抛出的最常用的异常是:

JVM引发的异常

  • ArrayIndexOutOfBoundsException
  • ClassCastException
  • NullPointerException
  • ArithmeticException
  • AssertionError
  • ExceptionInInitializerError
  • StackOverflowError
  • NoClassDefFoundError

通过编程方式抛出的API

  • llegalArgumentException
  • NumberFormatException
  • IllegalStateException
  • SecurityException

答案 4 :(得分:-1)

  

异常来自哪里

重要的是要了解导致异常和错误的原因以及它们的来源。 Java定义了两大类的异常和错误:

  1. JVM异常:那些排他性或唯一性的异常或错误 最合理地由JVM抛出

  2. 程序化异常:由那些显式抛出的异常 应用程序和/或API程序员

一个非常常见的例外,当您尝试使用当前值为NullPointerException的引用变量访问对象时,会发生null。编译器不可能希望在运行时之前发现这些问题。看一下以下内容:

class NPE {
    static String s;

    public static void main(String [] args) {
        System.out.println(s.length());
    }
}