Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのStringIndexOutOfBoundsExceptionとは?発生原因と対処法をわかりやすく解説

StringIndexOutOfBoundsExceptionとは

Javaにおいて、文字列(String)は一連の文字を格納するために使用され、オブジェクトとして扱われます。文字列は、java.langパッケージに含まれるStringクラスによって表現されます。

文字列の作成方法は主に2つあります。1つは他のオブジェクトと同様にnewキーワードを使用する方法、もう1つはプリミティブ型のようにリテラルを直接代入する方法です。

String stringObject = new String("Hello how are you");
String stringLiteral = "Welcome to Tutorialspoint";

文字列は内部的に文字の配列として管理されているため、配列と同じように各文字の位置はインデックス(0から始まる番号)で表されます。例えば、次のような文字列を作成した場合:

String str = "Hello";

各文字は以下のように配置されます。

JavaのStringIndexOutOfBoundsExceptionとは?発生原因と対処法をわかりやすく解説

文字列の長さ以上のインデックスにある文字にアクセスしようとすると、StringIndexOutOfBoundsException(文字列インデックス範囲外例外)がスローされます。

例外が発生する仕組み

JavaのStringクラスには、文字列を操作するためのさまざまなメソッドが用意されています。その中のcharAt()メソッドを使うと、指定したインデックス位置の文字を取得できます。

このメソッドは、取得したい文字のインデックスを示す整数値を引数として受け取り、その位置にある文字を返します。しかし、引数に文字列の長さ以上の値や負の値を渡すと、StringIndexOutOfBoundsExceptionが発生します。

発生例

次のJavaプログラムでは、長さ17の文字列を作成し、存在しないインデックス40の文字を出力しようとしています。

public class Test {
    public static void main(String[] args) {
        String str = "Hello how are you";
        System.out.println("Length of the String: "+str.length());
        for(int i=0; i<str.length(); i++) {
            System.out.println(str.charAt(i));
        }
        // 文字列の長さを超えるインデックスの要素へアクセス
        System.out.println(str.charAt(40));
    }
}

実行結果

文字列の長さを超えるインデックスの要素にアクセスしているため、実行時にStringIndexOutOfBoundsExceptionがスローされます。

Length of the String: 17
H
e
l
l
o
h
o
w
a
r
e
y
o
u
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 40
    at java.base/java.lang.StringLatin1.charAt(Unknown Source)
    at java.base/java.lang.String.charAt(Unknown Source)
    at Test.main(Test.java:9)

StringIndexOutOfBoundsExceptionを防ぐ方法

この例外を回避するためには、以下の対策が有効です。

  • length()で事前にチェックする: 文字にアクセスする前に、インデックスが0以上かつstr.length() - 1以下であることを確認します。
  • try-catchで例外を処理する: 範囲外アクセスの可能性がある場合は、try-catchブロックで例外を捕捉し、適切にハンドリングします。
  • ループ条件を見直す: for文などで繰り返し処理を行う際は、条件式がi < str.length()になっているか必ず確認しましょう。
// アクセス前に長さをチェックする例
if (index >= 0 && index < str.length()) {
    char c = str.charAt(index);
}

文字列のインデックスは「0から始まり、最大で length() - 1 まで」という点を常に意識しておくことで、この種のランタイム例外を効果的に防止できます。

  1. JavaのString intern()メソッドとは?その役割と使い方をわかりやすく解説

    JavaにおけるStringクラスの基本Stringは、Javaで一連の文字(文字列)を格納するためのクラスで、java.langパッケージに属しています。Stringオブジェクトは一度生成すると内容を変更できない「イミュータブル(不変)」という特性を持っています。文字列の保存場所すべてのStringオブジェクトは、ヒープ領域内にある「文字列定数プール(String Constant Pool)」と呼ばれる専用のメモリ領域に格納されます。文字列リテラルを定義するたびに、JVMは文字列定数プール内にその値を持つStringオブジェクトを生成します。そのため、同じ内容の文字列リテラルが複数存在して

  2. JavaでStringIndexOutOfBoundsException(非検査例外)を処理する方法

    StringIndexOutOfBoundsExceptionは、Javaにおける非検査例外(unchecked exception)の一つです。文字列は文字の集合体であり、Stringオブジェクトが持つ有効なインデックス範囲は [0、文字列の長さ] です。実際の文字列の範囲を超えて文字へアクセスしようとした場合に、この例外が発生します。例1:例外が発生するケースpublic class StringDemo { public static void main(String[] args) { String str = Welcome to Tutorials Poin