Зачем пытаться / ловить InputMisMatchException не работает, даже если я импортирую java.util.InputMisMatchException? - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь написать простой калькулятор и реализовать некоторые исключения. Я хочу поймать исключение InputMisMatchException, если клиент попытается ввести букву вместо числа. Я уже импортировал java.util.Input ... но это все еще не работает, и это завершает программу.

import java.util.InputMismatchException;
import java.util.Scanner;

public class Calculator {
    private static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        boolean menu = true;
        int choice;
        while (menu) {
            menuCalculator();
            System.out.println();
            System.out.println("Select operation: ");
            choice = sc.nextInt();
            sc.nextLine();
            switch (choice) {
                case 1:
                    try{
                    division();
                    } catch (InputMismatchException e){
                        System.err.println("Wrong input. Please enter valid value(s).");
                    }
                    break;
                case 5:
                    System.out.println("Shutting down calculator");
                    menu = false;
                    break;
            }
        }
    }

    public static void menuCalculator() {

        System.out.println("Press to go: \n 1. to divide \n 2. to multiplicate \n 3. to sum \n 4. to substract \n 5. to quit");
    }

    public static void division() {
        double firstNo;
        double secondNo;
        double result;

            System.out.println("Enter first number:");
            firstNo = sc.nextDouble();
            sc.nextLine();
            System.out.println("Enter second number:");
            secondNo = sc.nextDouble();
            sc.nextLine();
            result = firstNo / secondNo;
            if (secondNo == 0) {
                System.out.println("Cannot divide by 0");
            } else {
                System.out.println(firstNo + " / " + secondNo + " = " + result);
            }
    }
}

Ответы [ 2 ]

1 голос
/ 24 марта 2019

Исключение выдается nextInt, но у вас нет try / catch вокруг вашего звонка на nextInt, поэтому его не поймают. Переместите блок try / catch так, чтобы внутри него находился вызов nextInt. (Вы обрабатываете ошибку из division nextDouble, а не из nextInt.)

Но : Вы могли бы рассмотреть возможность вызова hasNextInt проактивно, а не реагировать на исключение реактивно. Оба подхода имеют свои плюсы и минусы.

Вот как вы будете использовать hasNextInt с циклом:

System.out.println("Select operation (1 - 5): ");
while (!sc.hasNextInt()) {
    sc.nextLine();
    System.out.println("Please entire a number [1 - 5]:");
}
choice = sc.nextInt();
sc.nextLine();
switch (choice) {
// ...

или для проверки диапазона, например:

do {
    System.out.println("Select operation (1-5): ");
    choice = -1;
    if (!sc.hasNextInt()) {
        System.out.println("Please enter a number (1-5, inclusive)");
    } else {
        choice = sc.nextInt();
        if (choice < 1 || choice > 5) {
            System.out.println(choice + " isn't an option, please enter a number (1-5, inclusive");
        }
    }
    sc.nextLine();
} while (choice < 1 || choice > 5);
switch (choice) {
// ...
0 голосов
/ 24 марта 2019

Если вы хотите поймать исключение, вам нужно окружить код, который принимает вход сканера.Вы потеряли блок try-catch, и он сработает.

...