nullは、変数の値に何も定義されていない(何も入っていない)状態を表す特殊は値で、nullが格納された変数に対しメソッド呼び出しを行うと、NullPointerExceptionが発生します。
NullPointerExceptionは、アプリのよくあるバグの原因として挙げられほどで、nullが入る可能性がある変数には必ずnull判定を行う必要があります。
この記事では、Javaでnull判定を行う方法や、Optionalクラスを使った新しいnull判定の方法などを解説します。
nullを判定する
null判定する方法は、Javaでは比較演算子で判定する方法や、StringUtils.isEmptyを使う方法など、いくつかの方法が用意されています。
それぞれのnull判定を見ていきましょう。
比較演算子を使ってnull判定
数値などの比較でも使用する、比較演算子の==や!=を使ってnull判定をします。
String str = null;
// strがnullか判定
if ( str == null ) {
System.out.println("str == null");
}
// strがnull以外か判定
if ( str != null ) {
System.out.println("str != null");
}
StringUtils.isEmptyでnull判定
isEmptyは、引数で渡された文字列がnullか空文字(“”)の場合にtrueを返すメソッドです。引数の方が文字列であるため、文字以外の変数型ではこのメソッドは使用できません。
String str = null;
if ( StringUtils.isEmpty(str) ) {
System.out.println("str == null");
}
Objects.isNull・nonNullで判定
Objectsクラスは Java 7で追加され、isNull、nonNullは Java 8で新たに追加されたメソッドです。引数で渡された値がnullの場合にtrueを返します。
isNull、nonNullの引数はObject型であるため、どのような型の変数でもnull判定が行えます。
Object obj = null;
if(Objects.isNull(obj)) {
System.out.println("obj == null");
}
Objectsクラスを使用する場合は、インポートにimport java.util.Objects;を追加することも忘れずに。
Objects.requireNonNullで判定
requireNonNullメソッドは、引数で指定した値がnullでないことをチェックします。
もし引数の値がnullだった場合、requireNonNullメソッドはNullPointerExceptionをスローします。
Object obj = null;
Objects.requireNonNull(obj);
【実行結果】
Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:208)
at Main.main(Main.java:12)
2番目の引数を指定すると、NullPointerException発生時のメッセージをカスタマイズできます。
Object obj = null;
Objects.requireNonNull(obj, "nullです");
次の結果のように、requireNonNullメソッドの第2引数に指定した文字列がNullPointerExceptionのメッセージに設定されていることが分かります。
Exception in thread "main" java.lang.NullPointerException: nullです
at java.base/java.util.Objects.requireNonNull(Objects.java:233)
at Main.main(Main.java:11)
Optionalを使った新しいnull判定
Java 8でjava.util.Optionalクラスが追加され、nullの新しい扱い方ができるようになりました。
java.util.Optionalは、nullの可能性がある変数を取り扱うために用意されたクラスでで、シンプルな構文でnullを含む変数などのメソッドを安全に呼び出せることが特徴です。
実際に、java.util.Optionalクラスを使って、null判定を行うサンプルコードを確認していきましょう。
Javaの高単価フリーランス案件はこちら
Optionalの宣言
Optionalクラスの生成は、次のいずれかのインスタンス生成用のstaticメソッド使います。
// 値がnullのOptionalインスタンスを生成します
Optional.empty();
// 値を指定してOptionalインスタンス生成
// ※ofメソッドにnullは指定できません。指定するとNullPointerExceptionが発生します
Optional.of(値);
// nullまたは値を指定してOptionalインスタンス生成
Optional.ofNullable(値);
isPresent()メソッドでNull判定
前述した方法で生成したOptionalオブジェクトが保持する値がnull以外の場合true、nullの場合falseを返すメソッドです。
// null以外の値
String str = "sample";
Optional<String> opt1 = Optional.ofNullable(str);
opt1.isPresent(); //-> true
// null
Optional<String> opt2 = Optional.ofNullable(null);
opt2.isPresent(); //-> false
orElse/orElseGetで安全に値を取得
orElseおよびorElseGetメソッドは、Optionalオブジェクトの値がnullだった場合に、引数で指定した代替の値を返すメソッドです。
nullの場合にデフォルト値を返すなどの用途に使用でき、NullPointerExceptionによるバグを防ぐ役割が期待できます。
まず、orElseメソッドの使い方をみてみましょう。値がnullだった場合の戻り値を引数で指定します。
// nullでOptionalオブジェクトを作成
Optional<String> opt = Optional.ofNullable(null);
// 値がnullのため、変数strには"default"が入る
String str = opt.orElse("default");
次にorElseGetメソッドの使い方です。
こちらのメソッドは、値がnullだった場合に戻り値を返す処理をラムダ式で記述します。
// nullでOptionalオブジェクトを作成
Optional<String> opt = Optional.ofNullable(null);
// 値がnullのため、指定のラムダ式が実行され変数strには"default"が入る
String str = opt.orElseGet(() -> {
return "default";
});
ifPresentでnulli以外の時だけメソッドを実行
ifPresentは、値がnull以外の場合のみ、引数で指定したラムダ式が実行されます。
import java.util.Optional;
public class Main {
public static void main(String[] args) throws Exception {
String str = "test";
final Optional<String> opt = Optional.ofNullable(str);
opt.ifPresent(f -> System.out.println("strがnull以外のときだけ呼び出されます"));
}
}
さいごに
Javaでnullを判定する方法や、Optionalクラスの使い方について解説してきました。
nullを正しく理解し、NullPointerExceptionなどのエラーが発生しないプログラムを作成しましょう。
【関連記事】
▶【Java】nullチェック忘れを未然に防ぐOptionalクラスについてわかりやすく解説します。
Javaのフリーランス案件を覗いてみよう
Javaのフリーランス案件は豊富にあり、条件も高いものが多いです。Javaの実務経験が2年以上あればフリーランスになるのも可能です。経験が5年程あれば月単価70万円以上も可能です。Java案件のトレンドが気になる方は、Java案件の単価相場や募集トレンド
をご覧ください。
当メディアを運営するポテパンでJavaフリーランス案件のご紹介もやっておりますので、最新Java案件一覧も是非ご覧ください。
もし、RubyなどのWebエンジニアへの転職を考えている方は、転職に強いポテパンキャンプをご利用いただくといいかと思います。
StringUtilsはJavaの標準APIではないため、Apache Commons Langのライブラリを導入する必要があります。