バナー画像

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");
}
ポテパンダの一言メモ

StringUtilsはJavaの標準APIではないため、Apache Commons Langのライブラリを導入する必要があります。

Objects.isNull・nonNullで判定

Objectsクラスは Java 7で追加され、isNullnonNullは Java 8で新たに追加されたメソッドです。引数で渡された値がnullの場合にtrueを返します。

isNullnonNullの引数は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判定を行うサンプルコードを確認していきましょう。

Optionalの宣言

Optionalクラスの生成は、次のいずれかのインスタンス生成用のstaticメソッド使います。

// 値がnullのOptionalインスタンスを生成します
Optional.empty();       

// 値を指定してOptionalインスタンス生成
// ※ofメソッドにnullは指定できません。指定するとNullPointerExceptionが発生します
Optional.of(値);

// nullまたは値を指定してOptionalインスタンス生成
Optional.ofNullable(値);

isPresent()メソッドでNull判定

前述した方法で生成したOptionalオブジェクトが保持する値がnull以外の場合truenullの場合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クラスについてわかりやすく解説します。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。