3

私は現在、他の誰かの Java コードのバグを修正していますが、そのバグについて説明することはできません。問題のコードは、次の if ステートメントです。

if (locked && DEBUG_ENABLED
    && owner != null 
    && (owner.equals(playerName) || subowner.equals(playerName))
    && handleCommand(playerName, message)) {
    ....
 } else {
    ....
 }

これDEBUG_ENABLEDは次のように初期化され、次のようprivate static boolean DEBUG_ENABLED = false;handleCommand機能します。

public boolean handleCommand(String name, String msg) {
    if(msg.equals("Command1")) {
        ....
    } else if(msg.equals("Command2")) {
        ....
    } ....
    } else {    // No matching command
        return false;
    }
    return true;
}

私を困惑させているのはDEBUG_ENABLED、 false に設定されていても、コードがまだhandleCommand関数を呼び出して実行していることです。私はいつも、短絡のためにこれが起こるはずがないと思っていました. 最初のスニペットの else ブロック内のコードのみが実行されるため、if ステートメント自体は依然として false として評価されます。

では、なぜこの if ステートメントはこのように振る舞うのでしょうか? 短絡に失敗していますか、それとも原則を誤解していますか、それともコードのこの部分にまったく別の問題がありますか? subowner(この部分の外側で行われるnull チェックの欠落に加えて。)

4

1 に答える 1

1

&&オペレータが短絡に失敗することはあり得ません。もしかして使って&た?そうでない場合は、最後の条件より前の条件が偽であったという誤った仮定を行ったことを意味します。

于 2013-09-07T20:22:03.010 に答える