27

次の式があるとします

String myString = getStringFromSomeExternalSource();
if (myString != null && myString.trim().length() != 0) {
...
}

myStringEclipseは、ブール式の 2 番目のフレーズが null である可能性があると警告します。ただし、最初の条件が失敗した場合、一部のコンパイラがブール式を完全に終了することを知っています。これはJavaに当てはまりますか?それとも、評価の順序は保証されていませんか?

4

4 に答える 4

46

ただし、最初の条件が失敗した場合、一部のコンパイラがブール式を完全に終了することを知っています。これはJavaに当てはまりますか?

はい、それはショートサーキット評価として知られ&&||います。

それとも、評価の順序は保証されていませんか?

いいえ、評価の順序は保証されています(左から右へ)

于 2010-01-08T15:44:45.800 に答える
8

Java はステートメントを左から右に評価する必要があります。短絡評価と呼ばれるメカニズムを使用して、最初の条件が false の場合に 2 番目、3 番目、および n 番目の条件がテストされないようにします。

したがって、式が null である場合、2 番目の条件はmyContainer != null && myContainer.Contains(myObject)評価されません。myContainermyContainer.Contains(myObject)

編集:他の誰かが述べたように、特にJavaには、ブール条件の短絡演算子と非短絡演算子の両方があります。を使用&&すると、短絡評価がトリガーされますが、トリガーされ&ません。

于 2010-01-08T15:43:31.183 に答える
2

ジェームズとエドは正しいです。以前の失敗した条件に関係なく、すべての式を評価したい場合に遭遇した場合は、非短絡ブール演算子 を使用できます&

于 2010-01-08T15:45:26.757 に答える
1

はい、Java はこのように if 文の遅延評価を実践しています。myString==null の場合、残りの if ステートメントは評価されません

于 2010-01-08T15:42:47.753 に答える