8

有人可以给我一个提示,为什么这种尝试和捕捉不起作用?它会引发扫描仪异常,而不是打印我期望的消息。

import java.util.*;
import java.io.*;
import java.math.*;
import javax.swing.*;

public class Main {
    public static void main(String[] args) {
        Boolean test = true;
        while (test == true) {
            try {
                double x, y;
                String operator;
                Scanner scan = new Scanner(System.in);
                Scanner scan_2 = new Scanner(System.in);
                Scanner ScanOperator = new Scanner(System.in);
                System.out.println(" Enter a double value: ");
                x = scan.nextDouble();
                System.out.println(" Enter another double value: ");
                y = scan_2.nextDouble();
                System.out.println(" Enter a operator for the operation you want to execute, or X if you want to quit: ");
                operator = ScanOperator.nextLine();
                if (operator.equals("x") || operator.equals("X")) {
                    test = false;
                    System.out.println("No calculation was made!!!");
                }
                System.out.println(Calculation(operator, x, y));
            } catch (NumberFormatException nfe) {
               JOptionPane.showMessageDialog(null,"Input must be a number.");
            }
        }
    }

    public static double Calculation(String operator, double x, double y) {
        double result = 0;
        double myAdd = 0;
        double mySub = 0;
        double myMult = 0;
        double myDiv = 0;
        double myPower = 0;
        double myMod = 0;

        if (operator.equals("+")) {
            myAdd = x + y;
            result = myAdd;
        } else if (operator.equals("-")) {
            mySub = x - y;
            result = mySub;
        } else if (operator.equals("*")) {
            myMult = x * y;
            result = myMult;
        } else if (operator.equals("/")) {
            myDiv = x / y;
            result = myDiv;
        } else if (operator.equals("^")) {
            myPower = Math.pow(x, y);
            result = myPower;
        } else if (operator.equals("%")) {
            myMod = x % y;
            result = myMod;
        } else {
        }

        return result;
    }
}
4

7 回答 7

21

很简单,程序抛出了ScannerException,但是你的try catch只能捕捉到NumberFormatException,你需要添加另一个catch子句才能捕捉到ScannerException,或者只捕捉泛型的Exception。

例如,当你说:

 } catch (NumberFormatException nfe) {     
     JOptionPane.showMessageDialog(null,"Input must be a number.");
 }

那只是指定如何捕获 NumberFormatException。
为了捕获所有异常,您需要这样做:

 } catch (NumberFormatException nfe) {     
     JOptionPane.showMessageDialog(null,"Input must be a number.");
 }catch (Exception e){
     JOptionPane.showMessageDialog(null,"Generic exception caught");
 }

在这种情况下,第二个 catch 将获取第一个 catch 中未捕获的所有内容,因为所有异常都扩展了 Exception 类,您可以使用该语句捕获所有派生类。

但是,由于不赞成单独捕获异常,您也可以这样做:

 } catch (NumberFormatException, ScannerException e) {     
     JOptionPane.showMessageDialog(null,"Input must be a number.");
 }

在同一个块中捕获两个异常。

于 2010-01-14T23:04:46.353 回答
4

您正在尝试捕获 NumberFormatException。您需要为 ScannerException 添加一条 catch 语句,因为它与 NumberFormatException 不同。

于 2010-01-14T23:03:55.667 回答
2

您需要捕获ScannerException或类似的东西。

在此代码中,您仅捕获NumberFormatException

试试这样的:

    try {
       ...
    } catch (NumberFormatException, ScannerException exception) {
       JOptionPane.showMessageDialog(null,"Input must be a number.");
    }
于 2010-01-14T23:04:43.153 回答
1

你捕捉到了错误的异常。

于 2010-01-14T23:03:30.710 回答
0

只需抓住InputMismatchException而不是NumberFormatException一切正常。

于 2010-01-14T23:09:55.287 回答
0

您的代码不会抛出NumberFormatException. 你应该抓住一个InputMismatchException

查看nextDouble, in Scanner,似乎Scanner代码NumberFormatException为您处理了 ,然后引发了不同类型的异常:

来自java.util.Scanner

public double nextDouble() {
    // Check cached result
    if ((typeCache != null) && (typeCache instanceof Double)) {
        double val = ((Double)typeCache).doubleValue();
        useTypeCache();
        return val;
    }
    setRadix(10);
    clearCaches();
    // Search for next float
    try {
        return Double.parseDouble(processFloatToken(next(floatPattern())));
    } catch (NumberFormatException nfe) {
        position = matcher.start(); // don't skip bad token
        throw new InputMismatchException(nfe.getMessage());
    }
} 

当您遇到这样的问题时,我建议您首先查看 Java 源代码。这是一个很好的资源。

另请注意,ScannerExceptionJDK 中没有。

于 2010-01-14T23:09:36.143 回答
0

为什么不这样做:

String input = scan.nextLine();
if(!input.matches("\\d+")) { // regex for 1 or more digits
    System.err.println("Input must be at least 1 digit!");
    continue; // goes back to the top of the loop
}
double dbl = Double.valueOf(input);

仅供参考,双精度的实际正则表达式将是 [digit][.][digit],而 [.][digit] 是可选的。

于 2010-01-15T01:21:12.180 回答