1

Я исправляю и очищаю свой школьный проект, и мы должны использовать функцию InspectCode в IntelliJ IDEA. Перед возвратом проекта мы должны исправить все предупреждения. Я получил некоторые предупреждения в категории «Декларация о резервировании/неиспользованной декларации». Это определение категории предупреждения:Java IntelliJ IDEA Serialization UnusedDeclaration inspection error

«Эта инспекция сообщает о классах, методах или полях в указанной области инспекции, которые не используются или недоступны из точек входа. «

Я не понимаю, почему. У меня есть в общей сложности четыре предупреждения, которые связаны с моим кодом сериализации (см. Код ниже). Проект работает нормально, и я не получаю ошибок. Я прошу помощи для понимания и надеемся, удастся устранить эти четыре предупреждения.

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); 
} 
} 

Это один из классов t hat вызывает ошибку: «Метод никогда не используется» Оба метода поднимают это предупреждение.

Как я уже говорил, все работает. Я знаю, что эти два метода вызываются, потому что я протестировал их, чтобы удалить их, а также подключиться к System.out.println (anytexthere) и вызван.

Интересно, должен ли я отмечать их или называть их отдельно или что-то еще.

Заранее спасибо.

ответ

2

Так работает механизм сериализации Java.

Есть некоторые API, такие как readObject, которые с помощью механизма сериализации называются рефлексивно. Однако они должны быть объявлены private. Когда вы смотрите с точки зрения только языка программирования, это частный метод, который никогда не упоминается нигде внутри этого класса, поэтому он должен быть неиспользуемым. Возможно, это то, что делает IntelliJ. По-видимому, это не учитывает рефлексивный характер сериализации. Это должно было бы быть использовано в любом виде статического анализа.

Насколько я вижу, в коде нет ничего плохого. Именно так работает механизм сериализации в Java.

Может быть какая-то аннотация, которую можно добавить (например, @SuppressWarnings?) Или вариант, который можно установить в IntelliJ, чтобы избежать такого предупреждения.

(Вы упомянули «оба метода», но я вижу здесь только один метод, readObject. Предполагаю, что другой метод - writeObject, который так же называется механизмом сериализации, и приведет к тому же предупреждению .)

Смежные вопросы