我正在修复和清理我的学校项目,我们应该使用 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/