Javaで論理演算子を使用する場合は主に|| や && を使用していると思いますが、| や &でも指定可能です。ということで「|| と |」、「&& と &」の違いについてメモしておきます。
「|| と |」の違い
- Javaサンプルソース
以下のソースでは「||」で判定している11行目では左辺の結果はtrueにより右辺の式は評価されずにnullポで落ちることはないですが、17行目の「|」では右辺の式も評価されてしまうのでnullポで落ちます。123456789101112131415161718192021222324package sample;import java.util.Objects;public class SampleClass2 {public static void main(String[] args) {String str1 = "abc";String str2 = null;if(Objects.nonNull(str1) || str2.equals("A")) {// 左辺の式がtrueにより右辺の式は評価されないのでNullPointerExceptionは発生しませんSystem.out.println("||演算子");}if(Objects.nonNull(str1) | str2.equals("A")) {// 左辺の式がtrueでも右辺の式も評価されるのでNullPointerExceptionがしますSystem.out.println("|演算子");}}} - 実行結果:コンソール
以下の様に17行目でNullPointerExceptionが発生しています。123||演算子Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "str2" is nullat sample.SampleClass2.main(SampleClass2.java:17)
「&& と &」の違い
- Javaサンプルソース
以下のソースでは「&&」で判定している10行目では左辺の結果はfalseにより右辺の式は評価されずにnullポで落ちることはないですが、16行目の「&」では右辺の式も評価されてしまうのでnullポで落ちます。12345678910111213141516171819202122package sample;import java.util.Objects;public class SampleClass3 {public static void main(String[] args) {String str1 = null;if(Objects.nonNull(str1) && str1.equals("A")) {// 左辺の式がfalseなら右辺の式が評価されないのでNullPointerExceptionは発生しません} else {System.out.println("&&演算子");}if(Objects.nonNull(str1) & str1.equals("A")) {// 左辺の式がfalseでも右辺の式も評価されるのでNullPointerExceptionが発生しますSystem.out.println("&演算子");}}} - 実行結果:コンソール
以下の様に16行目でNullPointerExceptionが発生しています。123&&演算子Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "str1" is nullat sample.SampleClass3.main(SampleClass3.java:16)