为什么即使导入java.util.InputMisMatchException也尝试/捕获InputMisMatchException不起作用?

时间:2019-03-24 14:00:28

标签: java exception inputmismatchexception

我正在尝试编写简单的计算器并实现一些异常。如果客户端尝试输入字母而不是数字,我想捕获异常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 个答案:

答案 0 :(得分:1)

nextInt引发了异常,但是您对try的调用没有catch / nextInt,因此不会被捕获。移动您的try / catch块,以使nextInt调用位于其中。 (您正在处理来自division的{​​{1}}的错误,而不是来自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) {
// ...

答案 1 :(得分:0)

如果要捕获异常,则必须将接受扫描程序输入的代码括起来。您将try-catch块放错了位置,那么它将起作用。