1

подскажи пожалуйста. почему у меня вылазит NumberFormatException после окончания расчета и при вводе yes. Я же закинул mathExpression = sc.nextLine() в do - while. Получается, что компилятор идет сначала на строку создания объекта с пустым параметром. Где ошибка? Помогите написать цикл, чтобы при пустом параметре объекта Calculator calc вызывалась фраза "Введите выражение по типу a + b через пробел:" и метод mathExpression = sc.nextLine();

    class CalculatorTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String mathExpression;
        String userAnswer = "yes";
        while (userAnswer.equals("yes")) {
            do {
                System.out.println("Введите  выражение по типу a + b через пробел: ");
                mathExpression = sc.nextLine();
            } while (mathExpression.equals(" "));
            Calculator calc = new Calculator(mathExpression);
            System.out.println(calc.calculate());
            do {
                System.out.print("Do you want to continue? [yes/no]: ");
                userAnswer = sc.next();
            } while (!userAnswer.equals("yes") && !userAnswer.equals("no"));
        }
    }

}

Введите выражение по типу a + b через пробел: 6 * 9 54 Do you want to continue? [yes/no]: y Do you want to continue? [yes/no]: yes Введите выражение по типу a + b через пробел: Exception in thread "main" java.lang.NumberFormatException: For input string: "" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68) at java.base/java.lang.Integer.parseInt(Integer.java:662) at java.base/java.lang.Integer.parseInt(Integer.java:770) at com.startjava.lesson_2_3.calculator.Calculator.<init>(Calculator.java:24) at com.startjava.lesson_2_3.calculator.CalculatorTest.main(CalculatorTest.java:15)

Process finished with exit code 1

В классе калькулятор конструктор

public Calculator(String mathExpression) {
        String[] arrExpression = mathExpression.split(" ");
        firstNumb = Integer.parseInt(arrExpression[0]);
        sign = arrExpression[1].charAt(0);
        secondNumb = Integer.parseInt(arrExpression[2]);
    }

Далее производятся математические действия с примитивами из массива arrExpression

public int calculate() {
        switch (sign) {
            case '+':
                return Math.addExact(firstNumb, secondNumb);
            case '-':
                return firstNumb - secondNumb;
            case '*':
                return firstNumb * secondNumb;
            case '/':
                return firstNumb / secondNumb;
            case '^':
                return (int) Math.pow(firstNumb, secondNumb);
            case '%':
                return (firstNumb % secondNumb);
            default:
                System.out.println("Введи знак мат.операции " + " + " + " - " + " * " + " / " + " ^ " + " % ");
            return 0;
        }
Kekcoe
  • 53
  • 8

2 Answers2

1

Лучше сделать так:

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String mathExpression;
        String userAnswer = "yes";
        while (userAnswer.equals("yes")) {
            mathExpression = "";
            userAnswer = "yes";
            System.out.println("Введите  выражение по типу a + b через пробел: ");
            do { 
                mathExpression = sc.nextLine();
            }while (mathExpression.equals(""));
            try {
                System.out.println(Calculator.calculate(mathExpression));
                do {
                    System.out.println("Do you want to continue? [yes/no]: ");
                    userAnswer = sc.next();
                } while (!userAnswer.equals("yes") && !userAnswer.equals("no"));
            } catch (ArrayIndexOutOfBoundsException | NumberFormatException | StringIndexOutOfBoundsException e) {
                System.err.println("Неправильный формат");
            }
        }
        sc.close();
    }

public class Calculator {
public static int calculate(String mathExpression) {
    String[] arrExpression = mathExpression.split(&quot; &quot;);
    int firstNumb = Integer.parseInt(arrExpression[0]);
    char sign = arrExpression[1].charAt(0);
    int secondNumb = Integer.parseInt(arrExpression[2]);
    switch (sign) {
    case '+':
        return Math.addExact(firstNumb, secondNumb);
    case '-':
        return firstNumb - secondNumb;
    case '*':
        return firstNumb * secondNumb;
    case '/':
        return firstNumb / secondNumb;
    case '^':
        return (int) Math.pow(firstNumb, secondNumb);
    case '%':
        return (firstNumb % secondNumb);
    default:
        System.out.println(&quot;Введи знак мат.операции &quot; + &quot; + &quot; + &quot; - &quot; + &quot; * &quot; + &quot; / &quot; + &quot; ^ &quot; + &quot; % &quot;);
        return 0;
    }
}

}

Agzam
  • 981
  • 1
  • 5
  • 19
  • Теперь вместо ошибки будет выскакивать красная надпись "Неправильный формат", а код будет продолжать работать – Agzam Jan 14 '21 at 15:08
  • Спасибо. Ответ на вопрос нашел здесь https://ru.stackoverflow.com/questions/526818/scanner-не-считывает-строку-после-nextint/ . Оказалось, что это специфика Scanner. – Kekcoe Jan 14 '21 at 15:27
  • Я изменил на вариант со static, это вариант гораздо проще (кода меньше) – Agzam Jan 14 '21 at 15:32
1

Так сделайте

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String mathExpression;
    String userAnswer = "yes";
    while (userAnswer.equals("yes")) {
      do {
        System.out.println("Введите  выражение по типу a + b через пробел: ");
        mathExpression = sc.nextLine();
      } while (mathExpression.equals(" "));
      Calculator calc = new Calculator(mathExpression);
      System.out.println(calc.calculate());
      do {
        System.out.print("Do you want to continue? [yes/no]: ");
        userAnswer = sc.next();
        sc.nextLine();
      } while (!userAnswer.equals("yes") && !userAnswer.equals("no"));
    }
  }
Aziz Umarov
  • 22,567
  • 2
  • 10
  • 33