前回は入力を求めるメッセージを出力し文字列の入力を取得するところまで作りました。今回は文字列ではなくint型整数を取得したいと思います。おそらく整数を入力値として取得したいという実装はいろいろあるでしょうから将来これを利用できるようにしておきます。
int型整数取得メソッド
int型は基本データなのでnull値というのはありえません。必ず何かの数字を取得するようにします。以下インタフェースを決めます。
- メソッド名はreadInt
- 引数は入力を促すメッセージ
- 戻り値は取得したint型整数
処理の流れは以下の通りです。
- 引数から受け取ったメッセージを出力する。
- 文字列を取得する。
- int型に変換する。
- 変換に失敗した場合は警告メッセージを出力して先頭に戻る。
- 戻り値としてその値を返しメソッドを抜ける。
実装する内容が決まったらコードを書きます。
/**
* 標準出力からint型整数を取得する
* @param message
* @return
*/
public int readInt(String message) {
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;
}
//変換した値を返す
return value;
}
}
ではmainメソッドを作り実行します。
public static void main(String[] args){
TerminalUtil terminalUtil = new TerminalUtil();
String name = terminalUtil.readString("名前を入力してください。");
int month = terminalUtil.readInt("誕生月を入力してください。");
System.out.println("あなたは" + month + "月生まれの" + name + "さんですね。");
}
以下実行結果です。誕生月に英字を入れたり空文字にしたりすると警告され再度入力させられています。
名前を入力してください。>ベルジェ 誕生月を入力してください。>abc 数字ではありません。 誕生月を入力してください。> 数字ではありません。 誕生月を入力してください。>7 あなたは7月生まれのベルジェさんですね。
ところで月は1月から12月までです。人によってはこんなことをする人がいるかもしれません。
名前を入力してください。>変わり者 誕生月を入力してください。>-1 あなたは-1月生まれの変わり者さんですね。
確かに数字ならなんでも良いことにしたので-1でも入力値としては問題ありません。ただ月に使う数字となるとそうはいきません。次回はこういった人の対策をとるようにします。