Почему моя инструкция switch выполняется до разрешения инструкции try catch?

#java #switch-statement #try-catch

#Ява #переключатель-заявление #попробуй-поймай

Вопрос:

У меня возникла проблема, из-за которой моя инструкция switch выполняется до того, как будет решена моя инструкция try catch. Я пытался перестроить свой код всеми доступными мне способами, но, похоже, не смог этого понять.

 public static void main(String[] args) {  Scanner input = new Scanner(System. in ); //declare scanner object called input for user input  char operation;  double num1 = 0;  double num2 = 0;   System.out.println("This calculator can perform basic mathematic functions such as "   "addition, subtraction, multiplication, and division. "   "nOnce you are finished using the calculator please enter a ! character.");  System.out.println("Please enter in which operation you would like to perform. "   "Enter   for addition, - for subtraction, * for multiplication "   "and / for division.");  operation = input.next().charAt(0);   boolean continueLoop = true;  while (operation != '!') {  do {  try {  System.out.println("Please enter the first number for your calculation.");  num1 = input.nextDouble();   System.out.println("Please enter the second number for your calculation.");  num2 = input.nextDouble();  continueLoop = false;  } catch(InputMismatchException e) //code that executes if exception InputMismatchException named e is found in code  {  System.err.printf("Exception: %s%n", e); //prints out the exception found  input.nextLine();  System.out.println("You must enter numbers. Please try again.");  }  } while ( continueLoop );   Calculator allMath[] = new Calculator[4];  allMath[0] = new Addition(num1, num2, operation);  allMath[1] = new Subtraction(num1, num2, operation);  allMath[2] = new Multiplication(num1, num2, operation);  allMath[3] = new Division(num1, num2, operation);   switch (operation) {  case ' ':  allMath[0].calculate();  break;  case '-':  allMath[1].calculate();;  break;  case '*':  allMath[2].calculate();  break;  case '/':  allMath[3].calculate();  break;  default:  System.out.println("Please enter a valid operation");  }  System.out.println("Please enter in which operation you would like to perform. "   "Enter   for addition, - for subtraction, * for multiplication "   "and / for division.");  operation = input.next().charAt(0);  }  }  

Я знаю, что существуют гораздо более простые способы создания базовой программы калькулятора, но эта программа реализует все требования, которые у меня есть для моего окончательного проекта. Если бы кто-нибудь мог помочь мне понять, что я сделал не так, это было бы здорово.введите описание изображения здесь

Я прикрепил фотографию своего вывода, чтобы вы могли видеть, где я ошибаюсь. Как вы можете видеть, программа выполняется правильно, за исключением того факта, что, как только я ввожу неверный номер, она берет мои ранее введенные номера и запускает их через мой оператор switch, прежде чем повторно выполнить мой оператор try catch.

Комментарии:

1. Вы отладили свое приложение?

2. @JeenbekKhydyr: Под ним нет кода.

3. System.err и System.out-это разные потоки, и они могут появляться на вашем терминале в разное время. Если вы показываете что-то пользователю для распознавания, просто используйте System.out.

4. Это не проблема… Проблема в том, что что-то было установлено, и приложение оставило это на время… Приложение снова вводит do while, но что-то не было сброшено… Было бы лучше использовать break вместо установки чего-то и делать, пока это правда… Что-то является переменным, что, очевидно, является проблемой здесь

5. Похоже continueLoop , что и управляемый им цикл do-while предназначены для запуска до тех пор, пока не будет введен допустимый ввод. В этом случае вы должны были поместить boolean continueLoop = true; в качестве первого утверждения после while (operation != '!')