閉じる

Javaで文字列の長さを取得する方法|length()メソッドの使い方と注意点を解説

Javaプログラミングを学ぶ上で、文字列操作は避けては通れない基本的なスキルのひとつです。

特に「文字列の長さを取得する」という処理は、データのバリデーションや加工、表示制御など、あらゆる場面で頻繁に利用されます。

Javaでは、標準ライブラリとして提供されているStringクラスのlength()メソッドを使用することで、簡単に文字列の長さを調べることができます。

しかし、単純にメソッドを呼び出すだけでは、特定の条件下で予期しない動作やエラーを引き起こす可能性があることをご存知でしょうか。

例えば、変数がnullである場合や、サロゲートペアと呼ばれる特殊な文字(絵文字など)が含まれている場合には、開発者が意図しない結果が返ってくることがあります。

本記事では、Javaにおける文字列の長さを取得する基本操作から、実務で直面しやすい注意点、さらには最新のJavaバージョンにおける最適な判定方法までを詳しく解説します。

Javaのlength()メソッドによる文字列長の取得

Javaで文字列の長さを取得する最も標準的な方法は、Stringクラスに定義されているlength()メソッドを使用することです。

このメソッドは、対象となる文字列に含まれる「char値(16ビットUnicode文字)」の数をint型で返します。

まずは、最も基本的なコードの記述例を確認してみましょう。

Java
public class Main {
    public static void main(String[] args) {
        // 文字列の定義
        String text = "Hello Java";
        
        // length()メソッドを使用して長さを取得
        int length = text.length();
        
        // 結果の出力
        System.out.println("文字列の長さは: " + length);
    }
}
実行結果
文字列の長さは: 10

上記の例では、半角英字とスペースを合わせた10文字がカウントされています。

Javaのlength()メソッドは、全角文字や記号であっても1文字としてカウントされます。

以下の例で、日本語(全角文字)が含まれる場合の挙動を確認してみましょう。

Java
public class Main {
    public static void main(String[] args) {
        String greeting = "こんにちは";
        System.out.println("「" + greeting + "」の長さ: " + greeting.length());
    }
}
実行結果
「こんにちは」の長さ: 5

このように、日本語のひらがなも適切に5文字としてカウントされていることがわかります。

ただし、後述するサロゲートペアの問題を除けば、基本的な文字列操作においてはこのメソッドだけで十分対応可能です。

文字列の「長さ」と配列の「要素数」の違い

Javaの初心者が混同しやすいポイントのひとつに、文字列の長さを取得するlength()メソッドと、配列の要素数を取得するlengthフィールドの違いがあります。

String型はクラスであり、メソッドを介して情報を取得するため、括弧が必要な「length()」を用います。

一方で、配列(Array)の場合はメソッドではなく、配列オブジェクトが持つプロパティ(フィールド)に直接アクセスするため、括弧を付けない「length」を使用します。

この違いを以下の比較表にまとめました。

対象記述方法分類
String(文字列)str.length()メソッド
Array(配列)arr.lengthフィールド(属性)
List(コレクション)list.size()メソッド

配列に対してlength()と記述したり、文字列に対してlengthと記述したりすると、コンパイルエラーが発生します。

IDE(統合開発環境)を使用していれば自動的に指摘されますが、手書きのコード試験やメモ帳でのコーディングの際には注意が必要です。

null値の扱いに伴うNullPointerExceptionの回避策

Javaで文字列の長さを取得する際に、最も注意しなければならないのがnullチェックです。

変数の値がnullである場合にlength()メソッドを呼び出すと、NullPointerException(NPE)が発生してプログラムが異常終了してしまいます。

安全に文字数をカウントするためには、メソッドを呼び出す前に変数がnullでないことを確認する必要があります。

Java
public class Main {
    public static void main(String[] args) {
        String input = null;

        // nullチェックを行わずに実行するとエラーになる
        // int len = input.length(); // NullPointerExceptionが発生

        // 安全な方法
        if (input != null) {
            System.out.println("長さ: " + input.length());
        } else {
            System.out.println("変数はnullです");
        }
    }
}

また、Java 8以降であれば、Optionalクラスを利用してスマートに記述することも可能です。

プロジェクトのコーディング規約に合わせて、適切なnull安全な処理を選択しましょう。

外部からの入力値を受け取るメソッドなどでは、「まずnullでないことを保証する」ことがバグを防ぐための鉄則です。

空文字と空白文字の判定方法(isEmptyとisBlank)

「文字列が入力されているか」を確認するために文字数を利用する場合、Java 11以降ではより直感的なメソッドが推奨されています。

従来は、文字数が0であることを判定するためにstr.length() == 0という条件式が多用されてきました。

現在は、isEmpty()メソッドを使用することで、同じ意味をより簡潔に表現できます。

さらに、Java 11からは、半角スペースや全角スペースのみで構成された文字列を「空」とみなすためのisBlank()メソッドが登場しました。

Java
public class Main {
    public static void main(String[] args) {
        String emptyStr = "";
        String spaceStr = "   "; // 半角スペースのみ

        // isEmpty()の挙動
        System.out.println("emptyStr.isEmpty(): " + emptyStr.isEmpty()); // true
        System.out.println("spaceStr.isEmpty(): " + spaceStr.isEmpty()); // false

        // isBlank()の挙動 (Java 11+)
        System.out.println("emptyStr.isBlank(): " + emptyStr.isBlank()); // true
        System.out.println("spaceStr.isBlank(): " + spaceStr.isBlank()); // true
    }
}

入力フォームなどで「スペースだけの入力も無効にしたい」という要件がある場合は、length() == 0よりもisBlank()を使用する方がコードの意図が明確になります。

用途に合わせて、「物理的な文字数(length)」、「中身が空か(isEmpty)」、「実質的に空か(isBlank)」を使い分けるようにしましょう。

サロゲートペア文字(絵文字など)を扱う際の注意点

実務レベルの開発で陥りやすい罠が、サロゲートペア(Surrogate Pair)による文字数のカウントミスです。

JavaのStringは、内部的にUTF-16という形式で文字を保持しています。

UTF-16では、多くの文字が16ビット(2バイト)で表現されますが、絵文字や一部の珍しい漢字などは32ビット(4バイト)で表現されます。

length()メソッドは「16ビット単位」でカウントを行うため、サロゲートペアの文字を1文字ではなく「2」としてカウントしてしまいます。

Java
public class Main {
    public static void main(String[] args) {
        // 絵文字(サロゲートペア文字)
        String emoji = "🐱"; 
        
        System.out.println("length(): " + emoji.length());
        
        // 正確な文字数を取得する方法
        int codePointCount = emoji.codePointCount(0, emoji.length());
        System.out.println("codePointCount: " + codePointCount);
    }
}
実行結果
length(): 2
codePointCount: 1

SNSの投稿機能やユーザー名のバリデーションなど、絵文字を許容するシステムを開発する場合、この仕様を理解していないと「10文字制限なのに5文字の絵文字でエラーになる」といった不具合を招きます。

人間が見た時の文字数と一致させたい場合は、codePointCount(int beginIndex, int endIndex)メソッドを使用するようにしましょう。

なお、このメソッドは文字数に比例した計算コストがかかるため、ループ内で頻繁に呼び出す際にはパフォーマンスへの影響を考慮する必要があります。

実践的な活用シーン:バリデーションの実装

文字列の長さを取得する処理が最も活躍するのは、ユーザーからの入力を受け取った際のバリデーション(妥当性確認)です。

例えば、パスワードの最低文字数チェックや、データベースの桁数制限を超えないためのチェックが挙げられます。

以下のサンプルコードは、実務でよく見られる「指定された範囲内の文字数であるか」をチェックするロジックの例です。

Java
public class Validator {
    /**
     * 文字列が有効な範囲内であるか検証する
     */
    public static boolean isValidLength(String input, int min, int max) {
        // nullの場合は無効と判断
        if (input == null) {
            return false;
        }
        
        // 前後の空白を除去してからカウント(要件による)
        int length = input.trim().length();
        
        return length >= min && length <= max;
    }

    public static void main(String[] args) {
        String username = "JavaUser";
        
        if (isValidLength(username, 4, 12)) {
            System.out.println("有効なユーザー名です。");
        } else {
            System.out.println("ユーザー名は4文字以上12文字以内で入力してください。");
        }
    }
}

このように、単にlength()を呼ぶだけでなく、trim()を組み合わせて「意味のある文字」だけをカウントするといった工夫も実務では重要になります。

また、文字数の上限チェックを行う際は、データベースのエンコーディング(UTF-8など)におけるバイト数制限と、Java上の文字数制限を混同しないように設計する必要があります。

まとめ

Javaにおける文字列の長さ取得は、一見すると非常に単純な操作に思えますが、実は奥が深いテーマです。

基本となるlength()メソッドは、通常の英数字や日本語を扱う分には非常に高速で便利なメソッドです。

しかし、プロフェッショナルな開発現場においては、null値への安全性(NPE対策)や、サロゲートペアによるカウントの不一致といったリスクを常に意識しなければなりません。

また、Java 11以降で利用可能なisEmpty()isBlank()を適切に使い分けることで、より読みやすくメンテナンス性の高いコードを書くことができます。

本記事で解説したポイントを整理すると、以下のようになります。

  • 文字列の長さ取得は str.length() を使用する。
  • 配列の length フィールドとの違いに注意する。
  • 必ず事前に null チェックを行い、NullPointerException を防止する。
  • 絵文字などの特殊文字を扱う場合は codePointCount を検討する。
  • 入力判定には isEmpty()isBlank() を活用して可読性を高める。

これらの知識を正しく身につけることで、堅牢で信頼性の高いJavaプログラムを構築できるようになります。

日々のコーディングにおいて、対象となるデータがどのような特性を持っているのかを考え、最適なメソッドを選択することを心がけてください。

URLをコピーしました!