Ошибочный результат расчета. ЯВА. Так застрял

Всем привет. Я застрял и не понимаю, почему код дает мне "неправильный" ответ.

Моя задача: написать программу, которая берет числа и считает их, пока пользователь не наберет "exit", затем программа распечатает сводку всех цифр, которые только что ввел пользователь, и остановится.

В данный момент я изучаю java онлайн и не знаю, как на это ответить: когда вы вводите 1, 2 или 3 числа или более, он вычисляет и печатает неправильный результат, или даже код не может быть скомпилирован и появляется ошибка.

Например, вы вводите 2 числа, и возникает ошибка

Исключение в потоке «main» java.lang.NumberFormatException: для входной строки: «exit» в java.base / java.lang.NumberFormatException.forInputString (NumberFormatException.java:68) в java.base / java.lang.Integer.parseInt (Integer.java:652) в java.base / java.lang.Integer.parseInt (Integer.java:770) в JR.constructors.Solution.main (Solution.java:11)


ИЛИ 3 числа, например 2 + 3 + 4, и выводится 6 вместо 8.

Помоги мне, пожалуйста!

А вот мой код

public static void main(String[] args) throws Exception {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    int sum = 0;
    while(true){
        int a = Integer.parseInt(reader.readLine());
        String s = reader.readLine();
        sum += a;
        if(s.equals("exit")){
            System.out.println(sum);
            break;
        }
    }
}

person Max    schedule 18.06.2020    source источник
comment
exit не похож на число для parseInt().   -  person Progman    schedule 18.06.2020
comment
Следите за потоком данных при вводе выхода. Куда его отдают до s.equals("exit") проверки.   -  person Carcigenicate    schedule 18.06.2020
comment
Может кто-нибудь объяснит это более ясно, пожалуйста   -  person Max    schedule 18.06.2020
comment
Проследите свой код с помощью отладчика или просто укажите пальцем на каждую строку. Вы создаете свой BufferedReader. Вы инициализируете sum нулем. Теперь вы запускаете цикл. Прочитать строку - если строки нет, она ждет. Разберите строку, которую вы только что прочитали как целое число, и присвойте ей a - если это не целое число, вы получите исключение NumberFormatException. Теперь прочтите еще одну строчку в s. Обратите внимание, что вы еще не производили расчет. Добавьте a в sum. Проверьте, является ли s выходом ... что, если вторая введенная вами строка - это число? Это число сравнивается с выходом, оно никогда не используется в расчетах. и Т. Д.   -  person Stephen P    schedule 18.06.2020


Ответы (3)


Если кто-то наберет что-то, кроме числа Integer.parseInt(), выдает ошибку и выдаст ошибку. Поэтому используйте переменную 1 для получения входных данных из потока, сначала посмотрите и проверьте, набрал ли пользователь "exit", если не пытается преобразуйте строку в целое число, обязательно поместите это в блок try catch, чтобы отловить ошибку, если пользователь ввел что-то недопустимое.

person RIVERMAN2010    schedule 18.06.2020
comment
@Max - использование только одной переменной также решит проблему с ошибкой вашего расчета - person Stephen P; 18.06.2020

Проблемы:

  1. Использование reader.readLine() дважды.
  2. Неправильное размещение критериев выхода.

Решение:

  1. Удалите reader.readLine() из Integer#parseInt.
  2. Поместите критерии выхода в начало цикла, чтобы программа могла выйти, не пытаясь проанализировать слово exit, которое выдаст NumberFormatException, потому что эта функция может анализировать только целочисленные строки.

    Код:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            int sum = 0;
            while (true) {
                String s = reader.readLine();
                if (s.equals("exit")) {
                    System.out.println(sum);
                    break;
                }
                int a = Integer.parseInt(s);
                sum += a;
            }
        }
    }
    

    Пробный запуск:

    2
    3
    4
    exit
    9
    
person Arvind Kumar Avinash    schedule 18.06.2020

Упомянутые ошибки (исключения) возникают из-за неправильного синтаксического анализа входных данных. Вы должны проводить четкое различие между чтением числа и чтением строки или с умом улавливать исключения при преобразовании строк в числа.

Вместо этого я бы предложил решение с Scanner (проще, понятнее и с меньшим количеством исключений).

public static void main(String[] args) {
    Scanner scn = new Scanner(System.in);

    String inputStr = null;
    int sum = 0;

    // Attention: order of conditions matters
    while(!"exit".equals(inputStr) && scn.hasNext()) {
        if(scn.hasNextInt()) {
            sum += scn.nextInt();
        }
        else {
            inputStr = scn.next();
        }
    }

    System.out.println("SUM="+sum);
    System.exit(0);
}
person bsaverino    schedule 18.06.2020
comment
Должен был быть BufferedReader как правило задачи, но спасибо! - person Max; 21.06.2020
comment
Арф, о котором не упоминалось. Но пожалуйста! Наслаждайтесь Java - person bsaverino; 21.06.2020