こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

文字列の一部分を取り出す

こんにちは。「Javaを復習する初心者」です。前回はString#substringメソッドで引数が一つの方を扱いました。今回は引数が2つある方を使います。こちらは文字列の一部分を取り出すメソッドです。使い方は、substring(int beginIndex, int endIndex) です。beginIndexは配列の要素番号と同じ考えて良いです。取り出される文字列は要素番号endIndex – 1にある文字までです。後半のendIndexがややこしいですが、endIndex = beginIndex + [取り出したい文字数]という関係になります。今回は2文字ずつ取り出すプログラムを書きました。

プログラム

以下にフローを書きます。今回はエラーが発生します。

  1. String型strを定義し、”Hello_World.”で初期化する。
  2. final int型COUNTを定義し、2で初期化する。
    1. 繰り返しカウンタiが0からstr.length()未満まで以下の処理を繰り返す。
    2. printfで”%2d:” + str.substring(i, i+COUNT)を出力する。%2dにはiを出力する。
    3. println()で改行する。

以下はソースと実行結果です。

package stringTest;

public class HelloSubstringBeginEnd {

    public static void main(String[] args) {

        String str = "Hello_World.";
        final int COUNT = 2;

        for (int i = 0; i < str.length(); i++) {
            System.out.printf("%2d:" + str.substring(i, i+COUNT), i);
            System.out.println();
        }

    }

}
 0:He
 1:el
 2:ll
 3:lo
 4:o_
 5:_W
 6:Wo
 7:or
 8:rl
 9:ld
10:d.
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 13
	at java.lang.String.substring(String.java:1963)
	at stringTest.HelloSubstringBeginEnd.main(HelloSubstringBeginEnd.java:11)

解説

i = 11のときエラーが発生しました。「String index out of range: 13」という内容なので、substring(11, 13)が実行されたときにエラーが発生してます。13は文字列の長さを超えてますがそのような指定は出来ないようです。実際にAPI仕様書を見るとエラーの条件の一つとして、「endIndexがこのStringオブジェクトの長さより大きい」と記載されてます。なるほど。例外の条件に引数の範囲が指定されてました。ということで、文字列の末尾周辺を取り出すときはこのエラーが出ないように注意が必要です。

ところで、COUNTはfinalを付けましたが、これは定数を宣言するときに使います。定数は代入操作が不可能です。代入する行を書くとコンパイルエラーになります。変数名はすべて大文字が一般的のようです。また内容がわかるような命名をする方が良いのですが、この場合、COUNTで良いのでしょうか。他に適切な単語が思いつきませんでした。