7

次のコードは、Eclipse で「デッド コード」警告を表示します。

private void add(Node<E> n, E element) {
        Node<E> e = new Node<E>(element);
        if (n == null)
            root = e;
        else if (n.compareTo(e) > 0)
            if (n.hasLeft())
                add(n.getLeft(), element);
            else
                n.setLeft(e);
        else if (n.hasRight())
            add(n.getRight(), element);
        else
            n.setRight(e);
        balance(e);
    }

という行に警告が表示されますroot = e;

デッド コードを調べたところ、コード ハットは効果がないため、Java コンパイラによって無視されることがわかりました。

ただし、このルートは私のクラスのプライベート フィールドであるため、プログラムの機能のためにこれを行う必要があります。

コンパイラは本当にこれを無視しますか? どうすればそれを止めることができますか? なぜそれがデッドコードだと思うのですか?

4

4 に答える 4

2

あなたが投稿rootしたメソッドを含むクラスのプライベートフィールドである場合、あなたが言ったように、その行はEclipse IDEによってデッドコードと見なされるべきではありません。 addroot = e;

コンパイラは正常に動作するはずです...これは単なる IDE 警告です。

私の推測では、Eclipse はある種のコード ウォーキング (循環的複雑度ツールに似ています) を実行して、コード パスを特定し、「デッド コード」と「到達不能コード」を見つけます。

リフレッシュしてから、IDE でクリーンアップとビルドを行います。それでも問題が解決しない場合、Eclipse はデッド コードの警告で「誤検知」を表示する可能性があります。初めてではありません...私はEclipseとIntelliJ IDEAの両方を使用しており、以前に両方のIDEがコードに対して誤って警告するのを見たことがあります。ただし、IDE の警告にもかかわらず、コードは正常にコンパイルされます。

于 2013-02-22T02:03:21.740 に答える
2

2 つの問題が発生している可能性があります。1 つ目: 問題は、行のルートが何にも「使用」されていないことです。findbugs では、同じエラーが「デッド ストア」と呼ばれます。これは、findbugsごとに次のことを意味します。

この命令は値をローカル変数に割り当てますが、その値は読み取られず、後続の命令で使用されません。計算された値が使用されないため、多くの場合、これはエラーを示します。

ここでのキーワードは「頻繁に」であることに注意してください。

ルートが期待どおりに使用されていることを確認します。そうである場合は、Philip Tenn が述べたように、誤検知である可能性があります。

2 番目: あなたの問題は、この問題に関連している可能性があります。

于 2013-02-22T02:03:47.130 に答える
1

ソースは正確な原因を見つけるのに十分ではないため、Dead コードに関連する Eclipse の問題に関連していると思います。ここここで確認できる問題の一部。

于 2013-02-22T02:14:50.793 に答える
0

あなたのif条件を見てください。

Node<E> e = new Node<E>(element);
if (n == null) {
    // dead code here
}

常にfalse にn == nullなるため、このコードは無効です。前の行で (無条件に)の新しいインスタンスを作成しました。新しいオブジェクトが null になることはありません。Node<E>

于 2014-01-15T05:51:37.863 に答える