Java 什么';关于变量初始化,构造这组try-catch块的正确方法是什么?

Java 什么';关于变量初始化,构造这组try-catch块的正确方法是什么?,java,error-handling,Java,Error Handling,我正在通过在线课程中的一个简单计算器挑战来练习java。其目的是在处理非数字输入和未列出的运算符的同时,获取数字输入加上所需的运算(+、-、%、*)。以下是我的尝试: public static void main(String[] args) { double d1; double d2; Scanner sc = new Scanner(System.in); try { d1 = getIn

我正在通过在线课程中的一个简单计算器挑战来练习java。其目的是在处理非数字输入和未列出的运算符的同时,获取数字输入加上所需的运算(+、-、%、*)。以下是我的尝试:

    public static void main(String[] args) {

        double d1;
        double d2;

        Scanner sc = new Scanner(System.in);
        try {
            d1 = getInput(sc);
            d2 = getInput(sc);
        } catch (InputMismatchException e) {
            System.out.println("Non numeric value entered.");
            System.exit(0);
        }

        try {
            System.out.println(calculate(sc, d1, d2));
        } catch(OperationNotSupportedException e){
            System.out.println(e.getMessage());
        }
    }

 private static double calculate(Scanner scanner, double d1, double d2) throws OperationNotSupportedException {
        System.out.print("Enter the desired operation: ");
        String op = scanner.next();
        System.out.println(op);

        switch (op) {
            case "-":
                return d1 - d2;
            case "+":
                return d1 + d2;
            case "*":
                return d1 * d2;
            case "/":
                return d1 / d2;
            default:
                throw new OperationNotSupportedException("The operation not one of (+ - % *)");
        }
    }

    private static double getInput(Scanner sc) {
        System.out.printf("Enter a numeric value: ");
        return sc.nextDouble();
    }

所以问题是编译器在第二个
try-catch
块中发现了问题。也就是说,
d1
d2
可能尚未初始化。我可以理解为什么在第一个
try catch
中抛出错误时会出现这种情况。我认为放置
System.exit()
可能会满足编译器的要求,但事实并非如此


如何重新构造代码以获得所需的结果?

由于d1和d2的第一次初始化在一个try块内,因此这些变量可能无法在第一个try块结束时初始化(在出现异常的情况下)。在这种情况下,您不能使用这些变量在第二个try块中调用
计算
,因为这些变量仍然不会初始化

只需初始化为:

double d1=0d;
双d2=0d;

在这个特殊的例子中,我会将第二个
try
中的内容移动到第一个
try
中,并在那里捕获两个异常。一旦其中一个被捕获,毫无疑问其中一个是由
getInput
抛出的,而
calculate
exit()中的另一个只是一个方法调用。编译器不知道特定方法不会返回。我,我只需要初始化d1和d2(0就可以了)。但我同意@FedericoklezCulloca;如前所述,似乎不需要两个试块。@FedericoklezCulloca好的,这很有道理@公平的东西。我想我认为它可能对编译器不透明。谢谢。我决定按照评论中的建议将两个try-catch块组合起来。但是,我将接受您的回答,因为它将清楚地解决我的问题。@rocksNwaves是的,您可以组合这些try块并使用多个catch块来处理特定的异常,因为每个异常的catch语句似乎都不同。否则,您可以使用单个catch,如:
catch(InputMismatchException | OperationNotSupportedException e)