みなさんこんにちは、一星零哉です。
前回の記事でタイマーアプリの要件とコードを展開しました。
今回からはこのプログラムのコードについて解説をしていきます!
for文
for文は「一定の条件のもとで同じ処理を繰り返したい場合」に使用する構文です。
「ループ処理」なんて呼び方をすることもあります。
for(int i = 0; i < tmpSetTime.length(); i++) {
if(!Character.isDigit(tmpSetTime.charAt(i))) {
System.out.println("数字を入力してください。");
return;
}
}
int型の変数iは「カウンタ変数」といい、ループの回数を保持します。
以下の部分でカウンタ変数を初期化しています。
int i = 0;
ここではループを回す回数の上限を設定しています。
i < tmpSetTime.length();
今回の場合は「カウンタ変数iが、tmpSetTimeが指し示す文字列の文字数未満の場合」となります。
このプログラムではループの条件をtmpSetTimeの文字数未満としていますが、もちろん以下のように数字で設定することもできます。
for(i = 0; i < 5; i++){
// ここに処理を記述
}
i++はカウンタ変数を1進める記述です。ループ1回分の処理が終わったら、最後にiに1を加算します。
lengthメソッド
lengthはString型のオブジェクトがコールするメソッドで、そのオブジェクトが参照する文字列の長さを取得することができます。
戻り値はint型です。
String blogTitle = "旅するエンジニア"
System.out.println(blogTitle.length()); // コンソールに「8」と出力される
上記の例では文字数をコンソールに標準出力するだけですが、プログラムの中で使用しているとおりfor文や条件分岐の判定に使用することもできます。
isDigitメソッド
isDigitはChar型のオブジェクトがコールするメソッドで、その文字が数字かどうかを判定します。
戻り値はboolean型です。
for(int i = 0; i < tmpSetTime.length(); i++) {
if(!Character.isDigit(tmpSetTime.charAt(i))) {
System.out.println("数字を入力してください。");
return;
}
}
ここで注意しなければならないのは、判定する単位は「文字」であって「文字列」ではない点です。
例えば「ANA987」という文字列があったとします。
これにisDigitメソッドで数字の判定をする場合、「A」「N」「A」「9」「8」「7」の1文字ずつメソッドを実行して個別に判定しなければなりません。
そのため、for文などの繰り返し処理と組み合わせて使うのが一般的です。
上記箇所では、「コンソールに標準入力された文字列に数字以外が入っていた場合に、メッセージを出力して処理を終了する」処理を記述しています。
余談ですが、ANA987は羽田発札幌行きの始発便です(2025年3月時点)。
charAtメソッド
charAtはString型のオブジェクトがコールするメソッドです。引数として渡された数値のインデックス位置に存在する文字を返します。
戻り値はChar型です。
注意しなければならないのは、文字列の1文字目のインデックス番号は「0」であることです。
文字列の先頭から末尾まで不足なく値を取得したい場合、charAtの引数の範囲は0〜文字列.length() – 1となります。
今回の上記繰り返し処理の条件が0 <= i < tmpSetTime.length()となっているのはこのためです。
エラーハンドリングの考え方
ここまで解説してきたコードはあくまでも「標準入力に数字以外が入力された場合にプログラムの処理を終了する」ためのものです。
今回のプログラムではコンソールに数字が標準入力されることを期待しているのであり、それ以外の文字や記号の入力は期待していないはずです。
もしコンソールに数字以外が入力された場合の対策を実施しなければ、入力された値をIntegerクラスのparseIntメソッドでint型に変換する処理でNumberFormatExceptionをスローしてプログラムが異常終了してしまいます。
もちろん、この処理を実装してもしなくても数字以外が入力された場合はタイマーが起動しない結果は変わりません。
しかしプログラムを設計する上で、対策できるエラーに対しては対策を施すべきです。
想定できるエラーは、正常処理のように開発者がコントロールするようにしましょう。
このように、エラーが発生した時のための処理を「エラーハンドリング」と言います。
parseInt
parseIntメソッドはIntegerクラスのstaticなメソッドで、引数に渡されたString型の値をint型に型変換します。
戻り値はもちろんint型で、例外発生時にはNumberFormatExceptionをスローします。
NumberFormatExceptionは文字列を数値型に変換しようとした時に、文字列の形式が正しくない場合にスローされる例外です。
まとめ
今回のまとめです!
- 一定の条件のもとで同じ処理を繰り返したい時はfor文などの「繰り返し処理」を使う
- lengthメソッドで文字列の文字数を取得する
- isDigitメソッドでその「文字」が数字かどうかを判定する
- 「文字列」ではなく「文字」単位であることに注意!
- charAtメソッドで引数として渡された値のインデックス位置を取得する
- 先頭のインデックス番号は「0」であることに注意!
- 想定されるエラーにはエラーハンドリングを実装してエラーをコントロールする
- Integer.parseIntでString型の数字をint型の数値に変換する
次回はタイマーのメインの処理のコードを解説していきますよー!
ここまで読んでいただきありがとうございました!
各種SNSのフォローもよろしくお願いします!
参考
lengthメソッド isDigitメソッド charAtメソッド Integer.parseInt NumberFormatException
コメント