java - 如何区分程序员异常和 JVM 异常

标签 java exception



正如标题所暗示的,我如何区分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/

相关文章:

.net - 类库应该如何向用户/UI 呈现通知?

C++ 类构造函数抛出异常

java - '\'-无效的字符常量?

Java 等价于 .Net 的 NotSupportedException

java - 通过在不同方法中处理异常来重构代码

c++ - 在跨 dll/so 的注入(inject)类中使用异常是否安全?

java - 检查字符串长度返回 NullPointerException?

java - 如何运行已粘贴到我的程序中的 Java 代码

java - JAXB 解码错误,没有 namespace 的包信息文件?

java - 无效的线程访问