前回はint型整数を標準出力から取得するメソッドを作りました。しかし整数と言っても小さい数から大きい数まで範囲が広いので使える数字だけ欲しい時には不便です。今回は少し改良を加えて必要な数字の範囲のものでないと再入力を求めるようにします。
処理の流れに変更を加える
前回のものに手を入れます。
- メソッド名はreadInt
- 引数は入力を促すメッセージと最小値と最大値(それぞれその値を含む)
- 戻り値は取得したint型整数
処理の流れは以下の通りです。
- 引数から受け取ったメッセージを出力する。
- 文字列を取得する。
- int型に変換する。
- 変換に失敗した場合は警告メッセージを出力して先頭に戻る。
- 変換に成功した値が範囲内であるか判定し範囲外の場合は警告メッセージを出力して先頭に戻る。
- 戻り値としてその値を返しメソッドを抜ける。
変更したところは赤字にしてあります。ではコードを書きます。
/** * 標準入力からint型整数を取得する * @param message * @param min * @param max * @return */ public int readInt(String message, int min, int max) { while(true){ //メッセージを出力 out.print(message + ">"); //入力を取得する String str; try{ str = in.readLine(); }catch(IOException e){ //例外発生時にはメッセージを出力してやり直す out.println(e.getMessage()); continue; } int value; try{ //intに変換する value = Integer.parseInt(str); }catch(NumberFormatException e){ //変換に失敗した場合は警告してやり直し out.println("数字ではありません。"); continue; } if(value < min || value > max){ //値が範囲外の場合は警告してやり直し out.println(min + "以上" + max + "以下の数字にしてください。"); continue; } //変換した値を返す return value; } }
前回のコードに引数を足し変換後に判定を一つ追加しました。以下はmainメソッドです。readIntのパラメータを二つ増やしました。最小月の1と最大月の12です。
public static void main(String[] args){ TerminalUtil terminalUtil = new TerminalUtil(); String name = terminalUtil.readString("名前を入力してください。"); int month = terminalUtil.readInt("誕生月を入力してください。", 1, 12); System.out.println("あなたは" + month + "月生まれの" + name + "さんですね。"); }
実行例は以下の通りです。空文字や範囲外の数字を入力すると警告が出ます。
名前を入力してください。>ベルジェ 誕生月を入力してください。> 数字ではありません。 誕生月を入力してください。>-1 1以上12以下の数字にしてください。 誕生月を入力してください。>0 1以上12以下の数字にしてください。 誕生月を入力してください。>13 1以上12以下の数字にしてください。 誕生月を入力してください。>7 あなたは7月生まれのベルジェさんですね。
機能を制限したメソッドも提供する
これで取得する範囲を指定するメソッドができました。しかし以前のどんな数字でも良いからint型整数を取得するメソッドも使えるようにしておきたいです。どうすればよいでしょう?
簡単なのは改修する前のメソッドも並べて置いておけば良いのですが似たようなコードを増やすのは望ましくありません。理由の一つには改修する場所がわからなくなってしまうこと、もう一つはなにか改修するときにその改修するべき場所が複数になってしまうことです。
似た処理を並列するのは避けるようにしましょう。int型の最小値と最大値はそれぞれIntegerクラスの定数MIN_VALUEとMAX_VALUEで取得できます。ここでは引数の最小値と最大値をint型のとりうる最小値と最大値として設定してgetIntを呼び出す同名のメソッドを作ります。同じ名前でも引数の数や種類が違うとJavaは別のメソッドと解釈します。
/** * 標準出力からint型整数を取得する * @param message * @return */ public int readInt(String message) { return readInt(message, Integer.MIN_VALUE, Integer.MAX_VALUE); }
引数はメッセージのみのメソッドができました。