Я создал небольшую программу, которая запрашивает у пользователя 10 случайных чисел и выводит сумму этих чисел. Я встроил его в цикл for и включил счетчик. Кажется, все работает нормально, за исключением того, что когда я запускаю программу, первый вопрос позволяет мне ввести два значения, но все равно будет вычислено только 10 чисел.

Ниже приведено то, что у меня есть сейчас, и мне нужно понять, что происходит не так, когда он запрашивает у пользователя номер в первый раз:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int sum = 0;
        int counter = 0;
        for (int i = 0; i < 10; i++) {
            counter++;
            System.out.println("Enter number #" + counter + " :");
            int numberInput = scanner.nextInt();
            boolean hasNextInt = scanner.hasNextInt();
            if (hasNextInt) {
                sum += numberInput;
            } else {
                System.out.println("Invalid Number");
            }
        }
        scanner.nextLine(); // handle the next line character (enter key)
        System.out.println("The sum is " + sum);
        scanner.close();
    }
}
0
Rick 23 Окт 2018 в 23:05

2 ответа

Лучший ответ

В каждом цикле вы вызываете scanner.nextInt() и scanner.hasNextInt(). Но вы не используете результат hasNextInt() осмысленным образом (вы могли заметить, что ваш вывод «Invalid Number» - это не то, что происходит, если вы вводите что-то, кроме числа).

Первый вызов nextInt() блокируется, пока вы не введете номер. Затем hasNextInt() снова заблокируется, потому что номер уже был прочитан, и вы спрашиваете, будет ли новый. Следующее число считывается из System.in, но вы фактически не используете его в этой итерации (вы просто спросили, есть ли оно). Затем в следующих итерациях nextInt() не будет блокироваться, потому что сканер уже извлек число из System.in и может немедленно вернуть его, поэтому все последующие запросы, которые вы видите, фактически ждут ввода на hasNextInt() ,

Всего 11 входных событий: первые nextInt() плюс все 10 hasNextInt() с.

1
OhleC 23 Окт 2018 в 20:19
Scanner scanner = new Scanner(System.in);
    int sum = 0;
    int counter = 0;
    for (int i = 0; i < 10; i++) {
        counter++;
        System.out.println("Enter number #" + counter + " :");
        int numberInput = scanner.nextInt();
       // boolean hasNextInt = scanner.hasNextInt();
        //if (hasNextInt) {
            sum += numberInput;
      //  } else {
        //    System.out.println("Invalid Number");
        //}
    }
    scanner.nextLine(); // handle the next line character (enter key)
    System.out.println("The sum is " + sum);
    scanner.close();

Не вызывайте hasnextInt (), здесь он бесполезен.

Потребовалось 11 вводов вместо 10.

Если вы удалите это условие, потребуется 10 входов и все будет работать нормально.

Ваше состояние никак на это не влияет.

1
Syed Hamza Hassan 23 Окт 2018 в 20:34
52957067