質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

1247閲覧

合計点が表示されない

icecleam

総合スコア46

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/08/21 14:27

編集2020/08/21 15:13

以下のコードでSumScoreを実行した時に「====== 合 計 点 一 覧 =====」の下に以下の形式で名前と各教科の点数の合計を表示させたいのですが、名前と点数入力後、何も表示されません。


名前:◯◯◯◯, 合計:△ 点

実行例

何人分の成績を入力しますか(数字で入力): 2
1人目の名前: qqq
国語: a
得点を入力してください。
国語: a
得点を入力してください。
国語: 1
算数: 1
理科: 1
社会: 1
2人目の名前: w
国語: 1
算数: 1
理科: 1
社会: 1

====== 合 計 点 一 覧 =====
[ここに表示させたいが何も出ません。]

色々試してみたのですが、うまく出力されないので知恵をお貸しください。。
よろしくお願いします

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/08/21 14:38

うまく出なくて、どういうふうに出てくるのでしょうか
icecleam

2020/08/21 14:42

ご質問ありがとうございます。 名前と合計点の部分が出力されないです。
guest

回答3

0

java

1 recordMap.put("理科", getScore("社会", bufReader));

社会を入力するつもりが、理科を上書きし、社会の点数は未登録のままになるので、

java

1 int syakai = (recordMap.get("社会")).intValue();

社会の点数を取得し、intに変換する段階でNullPointerExceptionになります。

投稿2020/08/21 15:35

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

try catch のcatch部で例外をcatchしていますが、例外処理がないので例外が発生していてもわかりません。
その部分を修正すると、合計点一覧を表示しようとした際に以下のように例外が発生しています。

====== 合 計 点 一 覧 ===== java.lang.NullPointerException at Person.calcSum(Person.java:36) at SumScore.main(SumScore.java:76)

これは、SumScore内で、社会の成績を聞いているにもかかわらず、理科の項目にセットしているのが原因です。

修正したSumScore.javaは以下の通りです。修正箇所は ★ を入れておきました

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 recordMap.put("社会", getScore("社会", bufReader)); // ★社会を入力しているのに理科になっている 68 69 // recordMap をPersonオブジェクトに代入する。 70 person[i].recordMap = recordMap; 71 } 72 73 // 合計点を計算し出力する。 74 System.out.println(); 75 System.out.println("====== 合 計 点 一 覧 ====="); 76 for (int i = 0; i < kazu; i++) { 77 int sum = person[i].calcSum(); 78 System.out.println("名前:" + person[i].name + ", 合計:" + sum + "点"); 79 } 80 81 } catch (Exception e) { 82 e.printStackTrace(); // ★例外を握りつぶさないように 83 } 84 } 85 86 static Integer getScore(String subject, BufferedReader bufReader) { 87 while (true) { 88 try { 89 System.out.print(subject + ": "); 90 String line = bufReader.readLine(); 91 if (!line.isEmpty()) { 92 try { 93 Integer score = Integer.valueOf(line); 94 if (score >= 0 && score <= 100) return score; 95 System.out.println("得点は 0~100点の範囲で入力してください。"); 96 97 } catch (NumberFormatException e) { } } 98 } catch (Exception e) { 99 e.printStackTrace(); // ★例外を握りつぶさないように 100 } 101 System.out.println("得点を入力してください。"); 102 } 103 } 104}

投稿2020/08/21 15:44

YakumoSaki

総合スコア2027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

何も表示されない場合、処理としてどうなってるか考えてみると良いです。

java

1 System.out.println("====== 合 計 点 一 覧 ====="); 2 for (int i = 0; i < kazu; i++) { 3 int sum = person[i].calcSum(); 4 System.out.println("名前:" + person[i].name + ", 合計:" + sum + "点"); 5 } 6 } catch (Exception e) { }

System.out.println("====== 合 計 点 一 覧 =====");が通っているのは確認できていると思うので
forの中のsysoutを取っていないことがわかります。

じゃあ、どこを通っているのか?
kazuが0ならfor文を通らない可能性があるが、0の場合は処理をすぐに中断しているので、
その可能性は違う。

では、どこだ?
ここです。
} catch (Exception e) { }

例外を握りつぶしてはいけない。の良い見本だと思いました。

java

1 } catch (Exception e) { e.printStackTrace(); }

と、すればすぐに解決できると思います。
※わからなければ、質問を修正(エラーメッセージの追記など)してもらえればと思います。

投稿2020/08/21 15:34

momon-ga

総合スコア4826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

icecleam

2020/08/21 15:42

ご回答ありがとうございます。 上記のコードでうまく実行できました。 例外の処理部分がよくわかっていなかったみたいです。。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問