2

当我创建一个自定义异常类时,如下所示

public class MyApppException extends Exception {

    private String message = null;

    public MyApppException() {
        super();
    }
    public MyApppException(String message) {
        super(message);
        this.message = message;
    }
    public MyApppException(Throwable cause) {
        super(cause);
    }
}

编译器给我下面的减弱

可序列化类 InsufficientBalanceException 未声明 long 类型的静态最终 serialVersionUID 字段

从Java doc我了解serialVersionUID的含义

序列化运行时将版本号与每个可序列化类相关联,称为 serialVersionUID,在反序列化期间使用该版本号来验证序列化对象的发送者和接收者是否已为该对象加载了与序列化兼容的类。如果接收者为对象加载了一个类,该对象的 serialVersionUID 与相应发送者的类不同,则反序列化将导致 InvalidClassException。可序列化的类可以通过声明一个名为“serialVersionUID”的字段来显式声明自己的serialVersionUID,该字段必须是静态的、最终的和long类型:

但是我不明白为什么Java在ExceptionThrowable类中声明serialVersionUID?ExceptionThrowable类中的 serialVersionUID 有什么用?真的需要吗?如果是,为什么?有人请澄清。

例外

public class Exception extends Throwable {
    static final long serialVersionUID = -3387516993124229948L;

可投掷的

public class Throwable implements Serializable {
    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -3042686055658047285L;
4

1 回答 1

2

您自定义的异常可以有一个状态(=实例变量),它们可以是您希望与异常一起记录的附加信息。状态是被序列化的。并且您可以在创建应用程序的新版本时更改状态(例如,添加新变量),因此加载序列化异常的类需要知道它加载的版本是否与 JVM 的类定义兼容有。

于 2015-06-21T08:24:55.880 回答