KuritaHiiro
@KuritaHiiro (@Hiiro)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

[Java] for文の中にScannerで入力した値を足して出力したい。

解決したいこと

・例外の対処
・for文で足した値の出力

Java初学者です。
paizaラーニングで問題を解いていました。
とある問題を解いていた際に出た例外が解決できません。
また、for文の中で出力する値が表示できるが、forの外で出力すると表示されない問題を解決したいです。

内容としては、a_iの値がmよりも小さい時、n-1の数足して出力するというものです。

解決方法を教えて下さい。

発生している問題・エラー

Exception in thread "main" java.util.NoSuchElementException
	at java.base/java.util.Scanner.throwFor(Scanner.java:937)
	at java.base/java.util.Scanner.next(Scanner.java:1594)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
	at Main.main(Main.java:14)

14行目は int a_i = sc.nextInt(); です。

該当するソースコード

import java.util.*;


public class Main {
    public static void main(String[] args) {
        // 自分の得意な言語で
        // Let's チャレンジ!!
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int total = 0;
        
        for (int i = 0; i < n; i++) {
            int a_i = sc.nextInt();
            
            if (a_i <= m) {
                total += a_i;
            }
        }
        System.out.println(total);
    }
}

自分で試したこと

import java.util.*;


public class Main {
    public static void main(String[] args) {
        // 自分の得意な言語で
        // Let's チャレンジ!!
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int total = 0;
        
        for (int i = 0; i < n; i++) {
            int a_i = sc.nextInt();
            
            if (a_i <= m) {
                total += a_i;
            }
            System.out.println(total);
        }
    }
}
--------------------------------------------------------------------------------
入力
n = 5 
m = 10 のとき

5
6
25
4

期待する出力
15

出力結果
5
11
11
15

出力結果は間違いですが、繰り返しの最後に出た15という値を出したいという目的には近いと考えています。ただ、そのやり方がわかりません。

ご教授お願いいたします。

0

2Answer

回答としては
「入力よりforループが多く回っているから」になります。

以下、長文になってしまうことを最初にお詫びいたします。

気になる点を述べるだけで、
決して叱責しているわけではない ので
何か役に立ちそうな部分があれば留意してみる、くらいに捉えてください。

解決までの道のりを含め、指摘したいことが3点あります。

(1) 今回発生した例外に関して標準出力の位置は関係ありません。

for文の中で出力する値が表示できるが、forの外で出力すると表示されない問題を解決したいです。

14行目で例外が発生して処理が中断されている以上、
問題の本質は System.out.println(total);の位置ではありません。

本質は @uasi さんの回答が全てです。

(2) 与えたれている前提条件及び、問題が不明瞭で分かり辛いです。

内容としては、a_iの値がmよりも小さい時、n-1の数足して出力するというものです。

何を示しているか言語化されていない「a_i」、
コードに記述されていない「n-1」が登場し、
上記の一文で説明されると「ん?」と回答側も困惑することがあります。

質問文の入出力と私自身の勘から問題をおおまかに推測で書きますが、恐らく

「1つ目に入力回数を示す整数n、2つ目に比較対象の整数mが与えられる。
3つ目以降は任意の整数(a_1、a_2、… a_i)が与えられる。(1 <= i <= n)
(※開始値や、比較演算子が「<」か「<=」か、等は分かりませんが)
a_i < m が成り立つ場合の合計値を求めよ。」

といったような問題ではないですか?
(今回はa_iが5、6、25、4でしょうか)

また、質問文では「mよりも小さい時」と記述があるにも関わらず
コードでは「<= m」(m以下)になっている点も気になります。

(3) 以下のように「目的には近いと考えています」と仰る根拠が分かりません。

出力結果は間違いですが、繰り返しの最後に出た15という値を出したいという目的には近いと考えています。

試したこととしてはSystem.out.println(total);の位置を変えてみただけ
ということしか本質問からは読み取れません。
(結局、NoSuchElementExceptionが発生するので
目的に近いと判断できる理由が不明です)

例ですが、(1)で私が申し上げた通りなので「標準出力の位置を変える」以外で
「何をしたら」、「結果がどのように変化し」、「変化から何を推測し」、
「推測を裏付ける(裏付けそうな)理由」
というような具体的な記述が欲しいところです。

以下は問題に直面した際、原因究明やヒントを得るのに使えそうな方法(一例)です。

・○○Exceptionって何の例外なんだろう(今回はNoSuchElementException)

・今使用しているクラスでどの場合に上記の例外が出るのだろう

※上記Scannerのdocs内にて「NoSuchElementException」を
「Ctrl+f」で検索し「nextInt」の項を読んでみてください。

少しでも何かに役立ててもらえるような情報があれば幸いです。

2Like

Comments

  1. @KuritaHiiro

    Questioner

    質問の回答を頂き、ありがとうございます!

    今回の場合、

    for (int i = 0; i < n; i++)

    の条件式を

    i < n-1

    にしたことで解決しました。

    また、頂いた3点のご指摘はとても勉強になりました。
    問題内容は、@syutorum001さんが推測された内容で、ほとんど間違いありません。

    回答する側を配慮した質問ができていなかったところなど、反省して次に活かしたいと考えます。

n = 5 のとき for 文が何周実行されるか、そのとき sc.nextInt() が何を返すか考えてみてください。

1Like

Comments

  1. @KuritaHiiro

    Questioner

    質問の回答を頂き、ありがとうございます。
    ループの回数が出力より1多かったことに気付くことができ、無事解決しました。

Your answer might help someone💌