«Ошибочный» результат расчета. JAVA. Так застрял - PullRequest
3 голосов
/ 18 июня 2020

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

Моя задача: написать программа, которая принимает числа и считает их до тех пор, пока пользователь не наберет "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 (Решение. java: 1 1)


ИЛИ 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;
        }
    }
}

Ответы [ 3 ]

4 голосов
/ 18 июня 2020

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

1 голос
/ 18 июня 2020

Проблемы:

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

Решение:

  1. Удалить reader.readLine() изнутри Integer#parseInt.
  2. Поместите критерий выхода в начало l oop, чтобы программа могла выйти, не пытаясь разобрать слово, 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
    
0 голосов
/ 18 июня 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...