Java IntelliJ IDEA 序列化 UnusedDeclaration 检查错误

标签 java serialization intellij-idea code-inspection unused-variables

我正在修复和清理我的学校项目,我们应该使用 IntelliJ IDEA 中的“InspectCode”功能。我们将在返回项目之前修复所有警告。我在“声明冗余/未使用的声明”类别下收到一些警告。这是警告类别定义:

“此检查报告指定检查范围内未使用或无法从入口点访问的类、方法或字段。”

我不明白为什么。我总共有四个警告与我的序列化代码相关(请参阅下面的代码)。该项目运行良好,我没有收到任何错误。我请求帮助来理解并希望能够删除这四个警告。

private void readObject(ObjectInputStream is) throws ClassNotFoundException, IOException {
// default de-serialization
is.defaultReadObject();
quests = new ArrayList<>();

QuestManager qm = (QuestManager) is.readObject();

for (String name : qm.questNames) {
    quests.add(QuestBank.getQuest(name));
}

for (Quest q : quests) {
    System.out.println("Quest name: " + q.name);
}
}

这是引发错误的类之一:“从未使用方法” 这两种方法都会引发该警告。

正如我之前所说,一切正常。我知道这两个方法正在被调用,因为我已经测试过删除它们,并且还调用了 System.out.println(anytexthere) 。

我想知道我是否应该标记它们或单独调用它们或其他什么。

提前致谢。

最佳答案

这就是 Java 序列化机制的工作方式。

有一些 API,例如 readObject,是由序列化机制反射调用的。但是,它们需要声明为私有(private)。仅从编程语言的角度来看,它是一个私有(private)方法,从未在此类中的其他任何地方引用,因此,它必须未被使用。也许这就是 IntelliJ 正在做的事情。它显然没有考虑序列化的反射性质。这在任何类型的静态分析中都必须是特殊情况。

据我所知,您的代码没有任何问题。这就是 Java 中序列化机制的工作原理。

可能可以添加某种注释(例如@SuppressWarnings?)或可以在 IntelliJ 中设置选项来避免此类警告。

(您提到了“两种方法”,但我在这里只看到一种方法,readObject。我认为另一种方法是writeObject,它的调用方式完全相同序列化机制,并将导致相同类型的警告。)

关于Java IntelliJ IDEA 序列化 UnusedDeclaration 检查错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25591971/

相关文章:

java - 在Java中使用instanceof运算符

c# - 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串长度超过

C++ boost元组序列化/反序列化

intellij-idea - Idea Intellij 如何从控制台的打印语句导航到行

java - StompSessionHandler 不在 afterConnected block 中调用 handleFrame?

java - 如果不是独立构建,Maven war 包含额外的依赖项

java - JAVA中的字符分割

java - 使用 Jackson 序列化和反序列化针对 JAVA 类的 JSON

java - 从Proto Buff实现服务器时无法解析符号类-一元API

Android Studio 的 IntelliJ IDEA SDK/AVD 管理器