正如标题所暗示的,我如何区分JVM 抛出的异常与以编程方式(这是否意味着,由程序员抛出或程序)抛出异常 ?
JVM 异常
1) ArrayIndexOutOfBoundsException
2) ClassCastException
3) 空指针异常
以编程方式抛出
1) 数字格式异常
2)断言错误
非常感谢
最佳答案
How to differentiate between Programmer and JVM Exceptions
你不能静态地这样做,因为不存在这样的区别。
标准 Java 类库中定义的任何异常都可能由应用程序或第三方库代码抛出。这包括 JVM 本身通常抛出的异常(包括您列出的异常)。
在某些情况下,抛出标准异常是一个糟糕(甚至是糟糕)的想法。例如,应用程序抛出类似
VerifyError
的内容将是一个非常糟糕的主意,因为它具有非常具体的含义,即应用程序没有业务抛出。在其他情况下,没有问题。例如,应用程序显式抛出
NullPointerException
没有问题1;例如public void setName(String name) { if (name == null) { throw new NullPointerException("name must not be null"); } this.name = name; }
区分由 JVM 和应用程序代码 抛出的异常的唯一可能方法是检查抛出异常的堆栈帧,以确定哪个类实例化了该异常。 (严格来说,这并没有告诉您异常是在哪里抛出的……但它已经足够接近了,因为异常几乎总是在同一条语句中被实例化和抛出。)
但即使这样也不是一个有用的区别。应用程序代码抛出的异常、标准类库或 JVM 本身在语义上没有区别。异常的来源当然没有说明问题的根本原因;例如无论是由于应用程序错误、库错误还是其他原因。
唯一有用的区别是:
- 您不应尝试从中恢复的错误异常,因为它们通常是不可恢复的。
- 其他可能可恢复的未经检查的异常,但通常是由错误引起的。
- 已检查的异常通常是由“环境”问题(例如不正确的文件名)引起的,很可能需要向用户报告。
这个问题有几种不同的解读方式:
如果您想区分 JVM 可能 抛出的异常和只能由 Java 代码抛出的异常,您可以通过在 OpenJDK 源代码中搜索位置来做到这一点本地代码抛出异常的地方。
如果您想区分 JVM 或标准 Java 库可能抛出的异常,请扩大搜索范围以包括 Java 源代码。
但是,在这两种情况下,“答案”都没有用(如上所述),并且取决于您检查的特定 Java 版本。
1 - 1)抛出NPE、CCE、AIOOBE等没有技术问题。 2) 我从来没有遇到过说你不应该这样做的风格指南。 3) 我从未见过关于为什么它应该“不受欢迎”的连贯解释。 (如果您知道,请提供指向它的链接。)
关于java - 如何区分程序员异常和 JVM 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2933832/