为什么我不能比较 Exception 对象的相等性?

Mar*_*tus 4 java

SSCCE:

import java.util.Objects;
public class FooMain {

    private static Exception foo() {
        try {
            throw new Exception();
        } catch (Exception e) {
            return e;
        }
    }


    public static void main(String args[]) {
        final int N = 2;
        Exception es[] = new Exception[N];
        for (int i = 0 ; i < N ; i++)
            es[i] = foo();
        System.out.printf("Exceptions are equal? %b\n", Objects.equals(es[0], es[1]));
        for (int i = 0 ; i < N ; i++) {
            System.out.printf("follows exception %d:\n", i);
            es[i].printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以上输出:

 [java] Exceptions are equal? false
 [java] follows exception 0:
 [java] follows exception 1:
 [java] java.lang.Exception
 [java]     at FooMain.foo(FooMain.java:6)
 [java]     at FooMain.main(FooMain.java:17)
 [java] java.lang.Exception
 [java]     at FooMain.foo(FooMain.java:6)
 [java]     at FooMain.main(FooMain.java:17)
Run Code Online (Sandbox Code Playgroud)

Juv*_*nis 7

异常类继承了它的equals()方法Object并且不会覆盖它。您每次都会创建新的 Exception 实例,它们是内存中的不同对象。即使它们的堆栈跟踪相同,它们在内存中仍然具有不同的对象分配,并且使用默认的 equals() 方法,它们也不相同。

但是,您可以定义自定义异常类并覆盖equals().