3

これらの比較は常に NullPointer Exception を作成しても安全ですか?

if( myObject == null || myObject.someMethod() == someValue )
{
    if( myObject == null && myObject.getAlwaysTrue() )
       {

       }
}

短絡とは別に、条件評価のためにJavaに方向性の優先順位がありますか?

更新:myObject.anything() NullPointer がスローされることはわかっています。他のプログラマーがそのようなコードに出くわしただけで、1 つの条件で複数のチェックを null チェックと一緒に圧縮する安全な方法があるかどうかを知りたいです。私は固執する良いルールを探しています。

4

6 に答える 6

6

いいえ、この行は安全ではありません:

if( myObject == null && myObject.getAlwaysTrue() )

それが nullであることがわかっている場合myObjectは、逆参照しようとしないでください。ただし、これを書いた場合:

if( myObject != null && myObject.getAlwaysTrue() )

それなら安全でしょう。これは、&&(さらに言え||ば)短絡評価があるためです。記述a && bして式aが false と評価された場合、式bは評価されないため、例外はスローされません。左オペランドは常に最初に評価されます。

于 2012-08-23T21:03:11.427 に答える
3

ゲーティングの問題を分離しないのはなぜですか?

if (myObject != null) {
    if ((myObject.someMethod() == someValue) && myObject.getAlwaysTrue()) {

    }
}
于 2012-08-23T21:06:09.680 に答える
2
if( myObject == null && myObject.getAlwaysTrue() )

これにより、NullPointerExceptionいつmyObjectnull

于 2012-08-23T21:03:26.493 に答える
1

myObjectがの場合、null2myObject.getAlwaysTrue()番目のifステートメントでは常に。になりNullPointerExceptionます。

式の場合||ifブール式は、最初の式が見つかるまで評価されtrueます。

式を使用&&するifと、ブール式が最初に見つかるまでブール式が評価されfalseます。

したがって、の場合、次の評価myObjectnull得られます。

最初if

myObject == null -> true

2番目if

myObject == null -> true
myObject.getAlwaysTrue() -> NullPointerException
于 2012-08-23T21:07:11.700 に答える
1

可能な限り、インデントを減らし、複雑な「ifology」を減らすよう努めています。あなたの場合、私はただ書きます

if (myObject == null) return;
... go on knowing that myObject is not null...
于 2012-08-23T21:18:54.973 に答える
0

これではありません :

if( myObject == null && myObject.getAlwaysTrue() )

&&両方の条件をチェックし、myObject.getAlwaysTrue()myObject が null の場合は NullPointerException をスローします。

于 2012-08-23T21:02:37.603 に答える