web-dev-qa-db-ja.com

Intellijのアイデアのヒント:条件は常にfalseです-ここでも同じですか? (Java)

私は次のコードを持っています:

_public String testExitPoints() {
    boolean myBoolean = false;
    try {
        if (getBoolean()) {
            return "exit 1";
        }
        if (getBoolean()) {
            throw new RuntimeException();
        }
    } finally {
        myBoolean = true;
    }
    if (getBoolean()) {
        return "exit 2";
    }
    return "exit 3";
}

public static boolean getBoolean() {
    Random Rand = new Random();
    return Rand.nextInt() > 100;
}
_

IntelliJのアイデアにより、2番目と3番目のgetBoolean()の呼び出しについて、次のヒントが得られます。

_Condition 'getBoolean()' is always 'false'
_

getBoolean()は、生成されたランダム値に応じて、trueまたはfalseのいずれかになる可能性があるため、私の理解では真実ではありません。ここに何か不足していますか、それともIntelliJ Ideaのバグですか?

16
Mathias Bader

バグではありません。それは機能です:)

IDEを注意深く見ると、getBoolean()の2番目と3番目の呼び出しは常にfalseですが、最初の呼び出しではないことがわかります。

アイデアは(この場合は誤って)パラメータなしで "get"と呼ばれるメソッドが常に同じ値を返すと想定しています。

それが事実であり、最初の呼び出しがtrueの場合、(戻りのため)もう1つはアクセスされません。

最初の呼び出しがfalseの場合、他の呼び出しも同様です。

IDEAはスマートなw.r.tを目指しています。優れたコーディング慣行ですが、間違いがないわけではありません。

メソッドをパラメーターを持つように変更した場合(またはゲッターのように見えないように名前を変更した場合)

public  boolean getBoolean(int x) {
    Random Rand = new Random();
    return Rand.nextInt() > 100;
}

警告はなくなります(常に同じ引数を指定して呼び出した場合でも)。

(getterであっても、final以外のフィールドの場合は、マルチスレッド環境で変更される可能性があるため、まだ間違っていることに注意してください!)

12
Diego Martinoia

残念ながら、受け入れられた回答は適切な説明を提供しますが、トリガーメソッドはサードパーティのコードに存在する可能性があるため、名前を変更できるとは限りません。たとえば、MongoDBライブラリのfirst()関数を使用していました。これは明らかにnull値を返すことができましたが、nullかどうかをテストするときに警告をトリガーしました。

IDEAが間違っていると確信している場合は、

                //noinspection ConstantConditions

問題を引き起こしているステートメントの前。

一般に、知っておくと便利なオプションは、[分析]メニューの[コードの検査...]です。そこで、プロジェクト全体、または関心のあるファイルだけを見ることができます。あなたが交渉したよりも多くの関心領域を見つけるかもしれません!質問の警告は、「予想されるバグ」の下に表示されます。 「可能性がある」ことに注意してください-IDEAは、それが完全ではないことを知っています:)

2
Reg

IDEAはgetBoolean()2回目(または3回目)に呼び出されても、呼び出しは変更されません。通常、同じ値を返す場合、2番目の呼び出しは決して達成できません。 IDEAそれを強調するのはそのためです。

2
StanislavL

私の場合、私がMY_ACTUAL_CLASS_NAME.getBoolean()を使用した場合、(メソッドが静的であるため)問題はありません。 IntelliJアイデアが静的を考慮していないためかもしれません(ここで起こり得るバグ)

0
Rajesh Goel