条件式にANDやORを使う


論理積演算子(&&)や(&)を使えば条件式に対してAND条件を評価できます。
論理和演算子(||)や(|)を使えば条件式に対してOR条件を評価できます。

条件式の戻り値はboolean型ですが、条件式やboolean型を扱う演算は論理演算といわれています。
ちなみに数値を扱う演算は、四則演算(算術演算)、関係演算(==,!=,<=,>=......)、インクリメント、デクリメント、シフト演算、ビット単位演算など多数ありあります。

下のコードでは演算子(&&)と(&)を使って同じように論理積演算を行っています。

public class ExamAnd1 {
    public static void main(String args[])  {
        String  ar[]  =  new String[3];
        ar[0]         =  "a";

        if(ar[1] != null  &&  ar[1].equals("a"))  {
           System.out.println("OK!");
        } else {
           System.out.println("NO!");
        }
    }
}

class ExamAnd2 {
    public static void main(String args[])  {
        String  ar[]  =  new String[3];
        ar[0]         =  "a";

        if(ar[1] != null  &  ar[1].equals("a"))  {
           System.out.println("OK!");
        } else {
           System.out.println("NO!");
        }
    }
}

<実行結果>
ExamAnd1はコンソールに”NO!”と表示されますが、
ExamAnd2を実行するとNullPointerExceptionが表示されます。


<(&&)と(&)の違い>
比較している内容は全く同じなのに、評価結果が異なるのは以下の理由からです。
if文の左の式 ar[1] != null では、ar[1]はnullですから、結果の戻り値は偽(false)です。
左の式を評価した時点で、論理積演算の結果は偽となる事が確定します。

演算子(&&)を使った場合、左の式を評価した時点で、条件が成立しない事が確定すれば、右の式は評価しません。
それに対して、演算子(&)の場合は必ず左右両方の式を評価します。
その為、右の式を実行し、NullPointerExceptionが発生します。

また、(||)と(|)の違いも同様です。



(&)と(|)は整数に対して使用です。
整数をオペランドにすると、オペランドのビット毎にAND、ORの演算を行います。