【问题标题】:Creating error message for invalid input with Java calculator使用 Java 计算器为无效输入创建错误消息
【发布时间】:2015-09-24 15:19:39
【问题描述】:

我必须用 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 语句的默认情况,然后再次运行(所以你会看到两次菜单),我只需要它出现一次

【问题讨论】:

  • 在 com.catalyst.training.calculator.Calculator.main(Calculator.java:70)。 70 号线在哪里?
  • 所以只是为了澄清你想在哪里看到错误信息。也不要为此使用 try catch 而是使用 while 循环并继续侦听 int。
  • 当有人被提示输入一个数字,并输入非 Int 的其他内容时,我想要一条错误消息,然后提示他们输入一个有效数字
  • 不要为此使用 try catch。而是使用 while 循环继续侦听,直到获得有效输入。
  • 如果我使用 do while 循环,我还能在 while 中使用 InputMismatchException 吗?

标签: java calculator


【解决方案1】:
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。对其他号码也同样如此。

【讨论】:

  • 对不起,如果这是一个愚蠢的问题,但是当我将它输入到我的案例中时,它不会运行其余代码并提示输入数字
  • 是的,您将不得不稍微修改您的代码。不要只是复制粘贴大声笑
  • 我已经更新了答案
【解决方案2】:

用 try catch 块包裹整个方法。您的 try/catch 块被本地化到一个区域,它只会在该部分抛出异常。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 对,如果不是 int 怎么抛出错误信息
    【解决方案4】:

    似乎在尝试乘法时引发了错误(大小写“*”)...它在 try/catch 之外,因此您将收到此错误。要么尝试/捕获每个输入,要么将整个事情包装成一个单一的动作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 2019-05-08
      • 2014-03-05
      相关资源
      最近更新 更多