以下のコードでSumScoreを実行時、一人目の名前を未入力でエンターを押した際に「名前を入力してください。」という文言を出力し、再度入力できるようにしたいのですが、うまく出力されません(内容は以下の通り)。
以下の画面でエンターを押すと、「名前を入力してください。」が無限に出力されます。
何人分の成績を入力しますか(数字で入力): 1
1人目の名前:
ここを変えればうまくいくとは思うのですが、わからなかったので教えていただきたいです。
よろしくお願いします。
JAVA
1 2 while (true) { 3 if (!inName.isEmpty()) break; 4 System.out.println("名前を入力してください。"); 5 }
java
1import java.util.HashMap; 2 3/** 4 * 個人の成績を格納し、合計点を計算する機能を提供する。 5 * 6 * @author 7 */ 8public class Person { 9 10 //デフォルトコンストラクターの宣言 11 public Person() { 12 } 13 14 /** 氏名 */ 15 String name; 16 17 /** 成績を格納(科目名, 点数) */ 18 HashMap<String, Integer> recordMap; 19 20 /** 21 * 引数に与えられた名前をもとに、新しいPersonオブジェクトを生成する。 22 * @param name 名前 23 */ 24 public Person(String name) { 25 this.name = name; 26 } 27 28 /** 29 * 合計点を計算する。 30 * @return 合計点 31 */ 32 public int calcSum() { 33 int kokugo = (recordMap.get("国語")).intValue(); 34 int sansu = (recordMap.get("算数")).intValue(); 35 int rika = (recordMap.get("理科")).intValue(); 36 int syakai = (recordMap.get("社会")).intValue(); 37 int sum = kokugo + sansu + rika + syakai; 38 return sum; 39 } 40}
java
1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3import java.util.HashMap; 4 5/** 6 * 氏名と各科目の点数を入力させ、合計値を表示する。 7 * 8 * 9 */ 10public class SumScore { 11 12 /** 新しいSumScoreオブジェクトを生成する。 */ 13 public SumScore() { 14 } 15 16 /** 17 * mainメソッド 18 * @param args コマンドライン引数(今回は使用しない) 19 */ 20 public static void main(String[] args) { 21 22 try (InputStreamReader inStream = new InputStreamReader(System.in); 23 BufferedReader bufReader = new BufferedReader(inStream)) { 24 25 int kazu = 0; 26 System.out.print("何人分の成績を入力しますか(数字で入力): "); 27 try { 28 String inParam = bufReader.readLine(); 29 kazu = Integer.parseInt(inParam); 30 if (kazu <= 0) { 31 System.out.println("人数は1以上にしてください。"); 32 System.exit(1); 33 } 34 } catch (NumberFormatException e) { 35 System.out.println("人数は整数で指定してください。"); 36 System.exit(1); 37 } 38 39 // 人数分だけPerson配列を生成する。 40 Person[] person = new Person[kazu]; 41 // 人数分だけ点数を入力させる。 42 for (int i = 0; i < kazu; i++) { 43 System.out.print((i + 1) + "人目の名前: "); 44 45 String inName = bufReader.readLine(); 46 while (true) { 47 if (!inName.isEmpty()) break; 48 System.out.println("名前を入力してください。"); 49 } 50 51 // 名前を引数にPersonオブジェクトを生成する。 52 person[i] = new Person(inName); 53 // 成績を格納するHashMapを生成する。 54 HashMap<String, Integer> recordMap = new HashMap<String, Integer>(4); 55 56 // 国語の点数を入力させ、recordMapに点数を格納する。 57 recordMap.put("国語", getScore("国語", bufReader)); 58 59 // 算数の点数を入力させ、recordMapに点数を格納する。 60 recordMap.put("算数", getScore("算数", bufReader)); 61 62 // 理科の点数を入力させ、recordMapに点数を格納する。 63 recordMap.put("理科", getScore("理科", bufReader)); 64 65 // 社会の点数を入力させ、recordMapに点数を格納する。 66 recordMap.put("理科", getScore("社会", bufReader)); 67 68 // recordMap をPersonオブジェクトに代入する。 69 person[i].recordMap = recordMap; 70 } 71 // 合計点を計算し出力する。 72 System.out.println(); 73 System.out.println("====== 合 計 点 一 覧 ====="); 74 for (int i = 0; i < kazu; i++) { 75 int sum = person[i].calcSum(); 76 System.out.println("名前:" + person[i].name + ", 合計:" + sum + "点"); 77 } 78 } catch (Exception e) { } 79 } 80 81 static Integer getScore(String subject, BufferedReader bufReader) { 82 while (true) { 83 try { 84 System.out.print(subject + ": "); 85 String line = bufReader.readLine(); 86 if (!line.isEmpty()) { 87 try { 88 Integer score = Integer.valueOf(line); 89 if (score >= 0 && score <= 100) return score; 90 System.out.println("得点は 0~100点の範囲で入力してください。"); 91 92 } catch (NumberFormatException e) { } } 93 } catch (Exception e) { } 94 System.out.println("得点を入力してください。"); 95 } 96 } 97} 98
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/23 03:54
2020/08/23 03:55
2020/08/23 11:33 編集
2020/08/23 23:18
2020/08/23 23:26
2020/08/23 23:28
2020/08/24 02:21
2020/08/24 02:24
2020/08/24 02:25
2020/08/24 02:26
2020/08/24 02:26