Java 什么';关于变量初始化,构造这组try-catch块的正确方法是什么?
我正在通过在线课程中的一个简单计算器挑战来练习java。其目的是在处理非数字输入和未列出的运算符的同时,获取数字输入加上所需的运算(+、-、%、*)。以下是我的尝试: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
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)