Java

Java 大文字小文字変換するときはNullに気をつけないとヤバいことになる話

Javaで文字列を大文字から小文字、小文字から大文字に変換する場合に、Stringクラスに標準搭載されている「toUpperCase()」「toLowerCase()」を使用すればそれだけで実現できますが、実際のシステムで使用する場合にはNullに注意が必要です。

Nullに注意が必要な理由と、対策方法をサンプルコードとともに解説します。

Javaの大文字小文字変換でNullに注意が必要な理由

普通に大文字小文字変換する場合は、以下のようにStringクラスのメソッドを使用することで変換することができます。

import java.util.Locale;

public class UpperCaseLowerCase {
    public static void main(String[] args) {
        // 大文字→小文字変換
        String upperWord = "ABCDE";
        System.out.println(upperWord.toLowerCase(Locale.ENGLISH));

        // 小文字→大文字変換
        String lowerWord = "abcde";
        System.out.println(lowerWord.toUpperCase(Locale.ENGLISH));
    }
}

実行結果は以下のとおりです。

abcde
ABCDE

非常に簡単に変換することができました。

ちなみに本記事では詳しく解説しませんが、トルコなどでこのプログラムが実行されると、想定外の結果になる可能性があるので、引数のLocaleには「Locale.ENGLISH」を指定することをオススメします。

しかし、変換する文字列がnullであった場合、実行時エラーの「NullPointerException」が発生してしまいます。

import java.util.Locale;

public class UpperCaseLowerCase {
    public static void main(String[] args) {
        // nullを変換しようとするとエラー発生
        String nullWord = null;
        System.out.println(nullWord.toLowerCase(Locale.ENGLISH));
    }
}

実行結果は以下のとおりです。

Exception in thread "main" java.lang.NullPointerException
	at UpperCaseLowerCase.main(UpperCaseLowerCase.java:7)

nullの文字列を変換しようとすると、ヌルポが発生してしまい、処理が止まってしまいました。

サンプルのように露骨にnullを設定していればまだ気づくことができますが、大規模なシステムになってくると別のクラスから渡ってきた文字列など、何が入っているか分からないというケースが往々にして発生します。

そのため、nullが渡ってこないように気をつけるのは非常に難しいので、nullがきても問題が発生しないようにする必要があります。

大文字小文字変換をするときは、Nullを変換しないようにすること

先に1番良い対策方法を申し上げますが、「if文でnullかどうかを確認しておき、nullに対して変換処理を実行しないようにする」という対策が良いです。

考えられる対策としては以下のようなものがあります。

  • あらかじめif文でnullか検査する
  • Optionalを使用しnullか検査する
  • try catchで例外処理する

大きく分けてnullチェックか例外処理をするかの二択ですが、NullPointerExceptionのような実行時エラーは、本来発生しないように制御しておいた上で、本当に想定もしていない出来事が発生したときに実行時エラーとして落ちるべきです。

なので、nullに対して大文字小文字変換をしないように制御しておくのが正しい対策です。

Optionalによる対策は悪くはないですが、大きな開発プロジェクトで使用すると、Optionalを知らない人や少しかじったレベルの人が大多数だと思います。

その場合にOptionalを使用すると、誤った使い方をしてしまったりでNoSuchElementExceptionが発生するなど、問題を解決できない可能性があります。

このことから1番良い対策は、普通のif文であらかじめ検査しておくことがベストです。

プロジェクトで使用する場合は、以下のようにメソッドを用意し、それを使用するルールにしてしまうのが良いでしょう。

import java.util.Locale;

public class UpperCaseLowerCase {
    public static void main(String[] args) {
        // 大文字→小文字変換
        String upperWord = "ABCDE";
        System.out.println(toLowerCaseIfNotNull(upperWord));

        // 小文字→大文字変換
        String lowerWord = "abcde";
        System.out.println(toUpperCaseIfNotNull(lowerWord));

        // nullを変換しようとすると空が返却される
        String nullWord = null;
        System.out.println(toLowerCaseIfNotNull(nullWord));
    }

    public static String toLowerCaseIfNotNull(String str) {
        if (str == null) {
            return "空だよー";
        }
        return str.toLowerCase(Locale.ENGLISH);
    }

    public static String toUpperCaseIfNotNull(String str) {
        if (str == null) {
            return "空だよー";
        }
        return str.toUpperCase(Locale.ENGLISH);
    }
}

実行結果は以下のとおりです。

abcde
ABCDE
空だよー

このようにすることで、nullを渡してもエラーが発生することなく処理することができるようになります。

もちろんnullが渡されてきたときにどうするかは、仕様に合わせて制御する必要があります。

まとめ

Javaの大文字小文字変換は初歩的な内容ですが、いざ開発で使用するときはNullPointerExceptionが発生してシステムがクラッシュする可能性があります。

そうしないためにも適切に制御しておく必要があります。

 

【お知らせ 無料!】未経験エンジニアがJavaでWebサイトを作成できるようになるための学習ロードマップを、無料で公開しています!

実体験に基づいて作成されているので、プログラミングスクールなどで指導されるロードマップにも劣らない品質です。

こちらの「【Java】エンジニア未経験者がJavaを効率的に勉強する手順を紹介します」リンクから無料で閲覧できるので、是非ご覧ください!

【2021/6 更新】エンジニア未経験者がJavaを効率的に勉強する手順を紹介しますプログラミングを勉強する際に候補に出てくる言語に Java があります。 最近は Java 以外の言語である、Ruby や Pyt...