0

これはバイナリ ツリー クラスの一部です。ここに find 関数があり、ツリー内のノードを見つけるためのキーが与えられます。見つからない場合は return ですが、ステートメントを下nullに移動すると、この部分はデッド コードとして認識されます。ループif(current==null)whileで動作しますが、なぜですか? それは同じですか?

public class Tree {
    public Node root;

    public Node find(int key) {
        Node current = root;
        while (current.key != key) {
            if (current == null) { //dead code here, why?
                return null;
            }

            if (key < current.key) {
                current = current.leftChild;
            } else if (key > current.key) {
                current = current.rightChild;
            }
        }
        return current;
    }
}

public class Node {
    public char label;
    public boolean visited = false;
    public int key;
    public float data;

    public Node leftChild;
    public Node rightChild;

}
4

5 に答える 5

1

なぜなら

while (current.key != key) // <-- current.key would throw NPE if current was null.
于 2013-12-31T05:20:00.547 に答える
1

事前にアクセスしているため、ヌルチェックに到達しない場合currentは、デッドコードになる前に新しい値を割り当てているため、下に 移動するとスローされます。(current.leftChild として、および可能性があります)nullcurrent.keynullPointerExceptionif(current==null)current.rightChildnull

于 2013-12-31T05:20:11.320 に答える
1

前のステートメントでは、 を逆参照していますcurrent.key。の場合current == nullは、NPE になります。そうでない 場合、到達することはないためnull、チェックは無意味です。if

おそらく意図したことはif、代わりにチェックをループの前に移動することでした。

public Node find(int key) {
    if (root == null) { 
        return null;
    }
    Node current = root;
    while (current.key != key) {
        if (key < current.key) {
            current = current.leftChild;
        } else if (key > current.key) {
            current = current.rightChild;
        }
    }
    return current;
}

これにより、意図した動作が得られます。

于 2013-12-31T05:20:43.593 に答える
0
while (current.key != key) {
        if (current == null) { //dead code here, why?
            return null;
        }

while 条件では、( current.key!=key を使用して) current が null でないことを既に確認しているため、 if(current==null) で再チェックしても意味がありません。current=null の場合、while() で NullPointerException が発生し、if 条件にさえ到達しません。

于 2013-12-31T05:20:29.580 に答える
0

key メンバーにアクセスしようとして、 current.key がまだ NullPointerException をスローしていない場合、while ループの開始時に current.key が null になることはありません。テストがループの一番下に移動すると、 current には、コンパイラが null の可能性があると認識する新しい値が割り当てられています。

于 2013-12-31T05:24:37.087 に答える