0

我有一个扩展异常的公共类。这是我的自定义异常类,如下所示:

package com.yahoo.chris511026.paragraphcount;

    public class InputException extends Exception {

    public String getMessage() {

        return "Error: No text entered.";

    }

}

InputException 下面是一条黄线,表示 InputException 类没有声明 long 类型的静态最终版本 UID 字段。如果我的类没有实现 Serialiazble 接口,为什么会这样说?我该怎么做才能清除解决此问题。我不想修改或添加任何东西到我的代码中。

4

4 回答 4

4

这是警告而不是错误。它指出serialVersionUID向任何可序列化类添加字段是一种好习惯。而且您的异常类已经是可序列化的,因为它间接扩展ThrowableThrowable实现了Serializable.

(如果您没有定义serialVersionUID字段,那么 JVM 会根据类的当前 API 定义动态计算一个字段。这会使您更容易受到由于类更改而导致的串行版本 UID 不匹配问题的影响。)

如果我的类没有实现 Serialiazble 接口,为什么会这样说?

不,不是这样说的。

我该怎么做才能清除解决此问题。我不想修改或添加任何东西到我的代码中。

有三种方法可以解决这个问题:

  • 如果您不想更改任何代码,请修改 IDE 的编译器设置以禁用此警告。

  • 添加一个serialVersionUID字段;例如,使用您的 IDE 加速器,它应该为您提供使用标准算法计算它的选项。

  • 添加适当的@SuppressWarning注释。如果您的异常对象将来需要序列化的可能性为零,这将是合适的。

于 2013-02-11T15:40:08.480 回答
1

您扩展Exceptionwhich 本身扩展Throwable了 which implements Serializable

更新,因为评论太多了:

选项:

  • 添加标识
  • @SuppressWarning("串行")
  • 配置您的 IDE 以忽略它
  • 完全忽略它
于 2013-02-11T15:37:54.090 回答
0

Exception 类实现了 Serializable 接口,并且通过继承,您的类也是如此。

序列版本唯一 ID 存在,以便您在反序列化时可以区分同一类的版本(例如,如果您以后想向您的类添加一个新成员,这将使其与没有该成员的旧版本不兼容)。

于 2013-02-11T15:38:06.120 回答
0

因为java异常类实现了Serializable接口。因此,您必须static final version UID在类异常的子类中声明。

如果不声明,程序会自动生成一个。这在大多数情况下是可以的,但如果两个异常类生成相同的 UID 或者如果类发生更改并且您碰巧使用旧 UID 反序列化旧异常,则可能会导致问题。

于 2013-02-11T15:42:03.053 回答