文字列やObjectを比較するのにStringクラスのequalsメソッドを用いて比較する場合がある.このメソッドはjava.lang.NullPointerExceptionの危険性がある.このメソッドを使用してObject同士を比較するとき,比較前のObjectがnullの場合にExceptionが発生する.このExceptionを防ぐためにObjects.equalsで比較することでnullチェックを同時に行い,nullの場合でも比較することができる.
Stringクラスのequals
Stringクラスのequalsメソッドを使用したときの,正常に比較できる場合とExceptionが発生する場合の挙動を確認する
正常に比較できる場合
■文字列同士の比較
String text1 = "aaaa";
String text2 = "bbbb";
System.out.print(text1.equals(text2));
実行結果
>false
■nullとの比較
String text1 = "aaaa";
String text2 = null;
System.out.print(text1.equals(text2));
実行結果
>false
Exceptionが発生する場合
String text1 = null;
String text2 = "bbbb";
System.out.print(text1.equals(text2));
>Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "text1" is null
比較前の文字列がnullの場合,Exceptionが発生する.
Stringクラスのequalsを使用する場合のException回避
String text1 = null;
String text2 = "ssss";
System.out.print(text1 != null && text1.equals(text2));
実行結果
>false
比較前の文字列でnullチェックを行う.nullの場合次の条件の検証には入らないためExceptionは発生しない.
Objects.equals
Stringクラスのequalsを使ってもいいが,nullが混入する可能性があるコードでこのメソッドは使用すべきでない.そもそもnullチェック忘れる恐れもある.そのため文字列やobjectの比較にはObjectsクラスのequalsメソッドを使おう.
※Objects.equalsはjava7から使用できる
String text1 = null;
String text2 = "ssss";
System.out.println(Objects.equals(text1, text2));
実行結果
>false
比較前の文字列がnullでも比較後の文字列がnullでもExceptionを発生させずに比較が可能.より安全に比較することができる.