【Java】文字列の末尾から任意の桁数を取得する方法|substringと範囲外エラー対策

Javaで「文字列の末尾○文字だけほしい」という処理は、ファイル拡張子や下4桁の取得などでよくあります。substring() で簡単に書けますが、取得したい桁数が文字列の長さを超えると例外(StringIndexOutOfBoundsException)になる落とし穴があります。この記事では基本の書き方と、安全に取得する方法までまとめます。

この記事の結論:末尾N文字は str.substring(str.length() - n) で取得します。ただし n が文字列より長いと例外になるため、Math.max(0, str.length() - n) で開始位置を0以上に補正すると安全です。
スポンサーリンク

substring()で末尾N文字を取得する

substring(開始位置) は、開始位置から末尾までを切り出します。末尾N文字なら、開始位置を「文字数 − N」にします。

末尾N文字を取得
public class Main {
    public static void main(String[] args) {
        String str = "Hello World";
        int n = 4; // 取得したい末尾の文字数

        String last = str.substring(str.length() - n);
        System.out.println(last); // orld
    }
}

桁数が長すぎると例外になる(要注意)

ここが最大の注意点です。n が文字列の長さより大きいと、str.length() - nマイナスになり、substring()StringIndexOutOfBoundsException を投げます。

NG: 桁数 > 文字数 で例外
String str = "abc";   // 長さ3
int n = 5;
// str.substring(3 - 5) → substring(-2) で例外
String last = str.substring(str.length() - n); // StringIndexOutOfBoundsException

開始位置を Math.max(0, ...) で0以上に補正すれば、桁数が長すぎても「ある分だけ」全部を返す安全な動きになります。

OK: Math.maxで安全に取得
public static String lastChars(String str, int n) {
    if (str == null || n <= 0) return "";
    int start = Math.max(0, str.length() - n);
    return str.substring(start);
}

System.out.println(lastChars("Hello World", 4)); // orld
System.out.println(lastChars("abc", 5));         // abc(例外にならず全部返る)
System.out.println(lastChars("abc", 0));         // 空文字
System.out.println(lastChars(null, 3));          // 空文字
桁数を変数や入力から受け取る場合は必ず境界チェックを入れましょう。n > 文字数n が0以下、null のケースを考慮しないと、実行時例外でプログラムが止まります。

先頭N文字を取得したい場合

逆に先頭N文字なら、開始位置0から substring(0, n) で切り出します。こちらも n が長すぎると例外になるため Math.min で補正します。

先頭N文字を安全に取得
public static String firstChars(String str, int n) {
    if (str == null || n <= 0) return "";
    return str.substring(0, Math.min(n, str.length()));
}

System.out.println(firstChars("Hello World", 5)); // Hello
substring() の基本はsubstringメソッドで文字列を切り出す方法、文字列の長さの取得は文字列と配列の長さを取得する方法で解説しています。

末尾が特定の文字列か確認するだけならendsWith

「末尾が .txt か?」のように末尾の一致を判定したいだけなら、末尾を切り出して比較するより endsWith() が簡潔です。

endsWithで末尾判定
String file = "report.txt";
System.out.println(file.endsWith(".txt")); // true

よくある質問(FAQ)

Q末尾N文字を取得する基本の書き方は?
Astr.substring(str.length() - n) です。開始位置を「文字数 − N」にすると、そこから末尾までが取得できます。
QStringIndexOutOfBoundsExceptionが出ます。
A取得したい桁数 n が文字列の長さより大きく、開始位置がマイナスになっているためです。Math.max(0, str.length() - n) で開始位置を0以上に補正してください。
Q先頭N文字を取得するには?
Astr.substring(0, n) です。こちらも n が長すぎると例外になるため、Math.min(n, str.length()) で補正すると安全です。
Q末尾が特定の文字列か調べたいだけです。
Astr.endsWith("...") を使います。末尾を切り出して比較するより簡潔で読みやすくなります。

まとめ

Javaで末尾N文字を取得するポイントを整理します。

  • 末尾N文字は str.substring(str.length() - n)
  • 桁数が文字数より長いと例外(StringIndexOutOfBoundsException)
  • Math.max(0, str.length() - n)安全に補正する
  • 先頭N文字は substring(0, Math.min(n, length))
  • 末尾の一致判定だけなら endsWith() が簡潔

関連として、substringで文字列を切り出す方法文字列の長さを調整する方法文字列の位置を取得する方法もあわせて読むと、Javaの文字列操作に強くなれます。