こんにちは。「Javaを復習する初心者」です。
前回はString#substring()メソッドで引数が一つの方を扱いました。今回は引数が2つある方を使います。こちらは文字列の一部分を取り出すメソッドです。使い方は、substring(int beginIndex, int endIndex) です。beginIndexは配列の要素番号と同じ考えて良いです。取り出される文字列は要素番号endIndex – 1にある文字までです。後半のendIndexがややこしいですが、endIndex = beginIndex + [取り出したい文字数]という関係になります。今回は2文字ずつ取り出すプログラムを書きました。
ソースと実行結果
以下にフローを書きます。よくあるミスとして、エラーが発生する部分があるようにしてみました。
- String型strを定義し、”Hello_World.”で初期化する。
- final int型COUNTを定義し、2で初期化する。
-
- 繰り返しカウンタiが0からstr.length()未満まで以下の処理を繰り返す。
- printfで”%2d:” + str.substring(i, i+COUNT)を出力する。%2dにはiを出力する。
- 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)
解説
for文の繰り返しカウンタ変数iの値が11のときエラーが発生しました。「String index out of range: 13」という内容なので、substring(11, 13)が実行されたときにエラーが発生してます。13は文字列の長さを超えてますがそのような指定は出来ないようです。実際にAPI仕様書を見るとエラーの条件の一つとして、「endIndexがこのStringオブジェクトの長さより大きい」と記載されてます。例外の条件に引数の範囲が指定されているということなので、文字列の末尾周辺を取り出すときはこのエラーが出ないように注意が必要です。
ところで、COUNTはfinalを付けましたが、これは定数を宣言するときに使います。定数は代入操作が不可能です。代入する行を書くとコンパイルエラーになります。変数名はすべて大文字が一般的のようです。また内容がわかるような命名をする方が良いのですが、この場合、COUNTで良いのでしょうか。他に適切な単語が思いつきませんでした。