使用 Java 计算器为无效输入创建错误消息

Creating error message for invalid input with Java calculator

我必须在 Java 中创建一个计算器。到目前为止一切正常,除了我无法弄清楚当有人在询问数字时输入的值不是整数时如何产生错误消息。我尝试了一个 "try, catch" 语句,但它仍然在 IDE 中抛出一个错误,即:

Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)

这是我程序其余部分的代码:

import java.util.InputMismatchException;
import java.util.Scanner;
public class Calculator {

static int num1, num2;
static int memory;
static String operation;
static String menu = "\nChoose an operation:\n+ Add\n- Subtract\n* Multiply\n/ Divide\n^ Exponent\n~ Square Root\n Exit";
static boolean run = true;

public static void menu (String menu){
    System.out.println (menu);
};

public static void add (int num1, int num2) {
    System.out.println (num1 +num2);}

public static void subtract (int num1, int num2) {
    System.out.println (num1 - num2);           
};

public static void multiply (int num1, int num2) {
    System.out.println (num1 * num2);           
};

public static void divide (int num1, int num2) {
    if (num2 !=0) {
        System.out.println (num1/num2);}
    else{
        System.out.println ("Cannot divide by 0");
    };
};

public static void exp (int num1, int num2) {
    System.out.println (Math.pow(num1,num2));           
};

public static void sqrt (int num1) {
    System.out.println (Math.sqrt(num1));           
};

public static void main(String[] args) {
    Scanner scanner = new Scanner (System.in);

    do{
        menu(menu);
        operation = scanner.next();

        try {
        switch (operation) {
            case "+":
                System.out.println ("Enter first number:");
                num1 = scanner.nextInt();
                System.out.println ("Please enter a valid number");
                System.out.println ("Enter second number:");
                num2 = scanner.nextInt();
                add (num1,num2);    
                break;
            case "-":
                System.out.println ("Enter first number:");
                num1 = scanner.nextInt();
                System.out.println ("Enter second number:");
                num2 = scanner.nextInt();
                subtract (num1, num2);
                break;
            case "*":
                System.out.println ("Enter first number:");
                num1 = scanner.nextInt();   
                System.out.println ("Enter second number:");
                num2 = scanner.nextInt();
                multiply (num1, num2);
                break;
            case "/":
                System.out.println ("Enter first number:");
                num1 = scanner.nextInt();
                System.out.println ("Enter second number:");
                num2 = scanner.nextInt();
                divide (num1, num2);
                break;
            case "^":
                System.out.println ("Enter first number:");
                num1 = scanner.nextInt();
                System.out.println ("Enter exponent:");
                num2 = scanner.nextInt();
                exp (num1, num2);
                break;
            case "~":
                System.out.println ("Enter number:");
                num1 = scanner.nextInt();
                sqrt(num1);
                break;
            case "Exit":
                System.out.println("You have exited the calculator");
                System.exit(0);
                run = false;
                break;
            default:
                System.out.println("Invalid");
            }
        }catch (InputMismatchException e) {

        }
    }while(run == true);



    scanner.close();
        }

};

谢谢!

好的更新:我得到了 try catch 来抛出错误,但是当我 运行 它出现错误时,它 运行 是 switch 语句的默认情况,然后 运行s(所以你看到菜单两次)我只需要它出现一次

用 try catch 块包装整个方法。你的 try/catch 块被定位到一个区域,它只会在该部分抛出异常。

您正在使用 Scanner.nextInt() 方法。当它看到无法转换为 int 的输入时,它将抛出 InputMismatchException。

http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextInt()

您可以通过首先检查 "hasNextInt()" 来验证下一个输入是否为 int 类型。

您的错误似乎是在尝试乘法时抛出的(大小写“*”)...它在 try/catch 之外,因此您会收到此错误。每个输入 try/catch 或将整个事情包装成一个单一的冲击。

case "+":
                System.out.println ("Enter first number:");
                while(!scanner.hasNextInt())
                {
                    System.err.println("Enter valid int");
                    scanner.next();
                }

                num1 = scanner.nextInt();
                System.out.println ("Enter second number:");
                while(!scanner.hasNextInt())
                {
                    System.err.println("Enter valid int");
                    scanner.next();
                }

                num2 = scanner.nextInt();
                add(num1, num2);

                break;

使用类似这样的东西代替 try catch 块。这样它就会一直听,直到你得到一个有效的num1。对其他号码也同样如此。