1

私は学校のプロジェクトを修正してクリーンアップしており、IntelliJ IDEA の「InspectCode」機能を使用することになっています。プロジェクトを返却する前に、すべての警告を修正する必要があります。「宣言の冗長性/未使用の宣言。これは警告カテゴリの定義です。

「このインスペクションは、指定されたインスペクション スコープ内のクラス、メソッド、またはフィールドを報告します。これらは使用されていないか、エントリ ポイントから到達できません。」

理由がわかりません。シリアル化コードに関連する合計 4 つの警告があります (以下のコードを参照)。プロジェクトは正常に動作し、エラーは発生しません。これら 4 つの警告を理解し、うまくいけば削除できるように、助けを求めています。

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

これは、エラーを発生させるクラスの 1 つです。「メソッドは使用されていません」 両方のメソッドでその警告が発生します。

前に言ったように、すべてが機能します。私はこれらの2つのメソッドが呼び出されていることを知っています。なぜなら、それらを削除することをテストし、 System.out.println(anytexthere) を攻撃し、それが呼び出されるからです。

私はそれらをマークするべきなのか、それとも別々に呼ぶべきなのだろうか.

前もって感謝します。

4

1 に答える 1

2

これが、Java シリアライゼーション メカニズムの仕組みです。

readObjectシリアライゼーション メカニズムによって反射的に呼び出されるような API がいくつかあります。privateただし、宣言する必要があります。プログラミング言語だけの観点から見ると、このクラス内から他のどこにも参照されないプライベート メソッドであるため、使用されない必要があります。おそらく、これは IntelliJ が行っていることです。シリアライゼーションの反射的な性質を考慮していないようです。これは、あらゆる種類の静的分析で特別なケースにする必要があります。

私が見る限り、あなたのコードには何も問題はありません。これは、Java でシリアライゼーション メカニズムが機能する方法です。

この種の警告を回避するために、追加できるある種の注釈 ( @SuppressWarnings? など) または IntelliJ で設定できるオプションがある場合があります。

(「両方のメソッド」について言及しましたが、ここには 1 つのメソッドしか表示されません。もう 1 つのメソッドは、シリアライゼーション メカニズムによってまったく同じ方法で呼び出される であり、同じ種類の警告が表示されると思います。readObject)writeObject

于 2014-09-02T23:30:28.790 に答える