为什么Java中的异常类不实现equals方法?

为什么Java中的异常类不实现equals方法?,java,Java,为什么Exception类(like)不实现equals()方法 例如,此代码的默认值为false: /* Name of the class has to be "Main" only if the class is public. */ class Ideone { public static void main (String[] args) throws java.lang.Exception { final RuntimeException e1 = n

为什么
Exception
类(like)不实现
equals()
方法

例如,此代码的默认值为
false

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        final RuntimeException e1 = new RuntimeException("e");
        final RuntimeException e2 = new RuntimeException("e");
        System.out.println(e1.equals(e2));
    }
}
没有实现
equals()
有什么原因吗?在我看来,这将是相当有用的

编辑:让我进一步讨论这个问题,因为大多数人似乎认为
equals()
实现是没有用的

我想知道,为什么异常的处理方式应该与普通对象不同,并且只有在其实例相同时才进行匹配。它自身没有足够的信息与其他对象进行比较。例如,我认为存储调用堆栈的底层已经实现了
equals
方法


异常的定义中有什么东西阻止他们基于属性实现equals方法吗?

那么
异常
是普通的类实例。异常可以维护一个状态

例如,可以声明在一个特定行上抛出的带有特定消息的异常不等于在下一行抛出的异常

即使错误被抛出在同一行,调用堆栈相同,但程序运行不同,也可以说异常不一样。。。例如,第一个程序可以通过以下方式调用:

java -jar program.jar "arg1" & java -jar program.jar "arg2"
程序具有不同的
pid
,以不同的时间戳抛出

但是,您可以自己使用继承实现
equals
方法(对于您自己定义的
异常
s):

毕竟,stacktrace只在构建时“存储”在
异常中,一个完全有效的java程序如下所示:

public class MyClass {


    public static void main(String args[]){
        Exception ex = new IndexOutOfBoundsException();
        ex.printStackTrace(System.out);
    }
}
结果是:

java.lang.IndexOutOfBoundsException
    at MyClass.main(MyClass.java:15)

换句话说,
抛出
异常
没有多大关系<代码>抛出
仅仅意味着“可选的
返回
”。它与存储堆栈跟踪无关,

请注意,尽管
异常
没有覆盖
等于
,但它确实有一个实现,即从
对象继承的实现,它比较身份

对于大多数情况,您可以实现异常比较器,例如,只记录第一次出现的异常,或者与模板进行比较,尽管我猜在这种情况下堆栈跟踪是不可比较的。如果您想支持更多的基本字段,就必须为某些异常类定义特定的比较器


异常不太倾向于值语义。如果它们有,你会怎么做,将它们用作哈希表键?在这种情况下,您可以实现一个包装类,
等于
,而
hashCode
的行为就是这样。

有一个简单的解释:两个不同的
异常
实例在任何意义上都是不相等的

例外平等的含义是什么?如果两个对象相等,它们在某种意义上是相同的。但是
异常的两个实例在语义上总是不同的-要么异常发生在另一个地方(即stacktrace不同),要么很可能发生在另一个时间,即在不同的情况下


Exception
s的两个不同实例永远不应该相等,因为它们不能代表同一事物。

为什么需要比较
Exception
s?我不需要比较<代码>异常< /代码>。如果你想比较<代码> RunTimeExtExt[/Cord]对象,创建你自己的子类,它覆盖了<代码>等于。这些异常会有不同的堆栈跟踪,所以你真的认为它们是相等的吗?但是StAccTraceEngEnter本身实现了一个等值方法,但这并不是一个例外。如果堆栈跟踪实际上是不同的,这没关系,但我不明白为什么它完全没有实现。@asteri可以详细说明“必须在不同的堆栈帧中声明,根据定义”这不是相等测试,而只是测试的一个实例。@ChrisStratton:如果异常不包含状态,这差不多。但我们需要问的第一个问题(答案中记录了这一点)是当两个
异常
相等时。他们需要共享相同的堆栈跟踪吗?同样的过程?同样的时间戳…我能看出你的意思。但是在第一行,你是说异常不是普通的类实例吗?@SANDeveloper:no,
Exception
s是与
ArrayList
相同的类,。。。只有在构造函数级别构造
异常时(为了参数起见),堆栈跟踪才会序列化并存储在异常中,等等。
java.lang.IndexOutOfBoundsException
    at MyClass.main(MyClass.java:15)