我正在用一个while循环和开关编写一个简单的程序,它接受一个数学运算并为给定的2个数字执行它。
我遇到的问题是,为什么我应该在开始时将操作产生的结果初始化为零。
如果我没有让ans = 0,它会给我错误。如果不满足给定的条件,则不执行某些代码部分,并且我不需要" ans"。
package q3;
import java.util.Scanner;
public class Q3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
char operator;
float no1, no2, ans=0; // <-------------- Why should I initialize ans
do {
System.out.println(" Mathematical Operations to be performed :");
System.out.println("\t * Multiplication\n\t / Division\n\t + Addition\n\t - Subtraction");
System.out.println("Press any other character to exit");
System.out.print("Mathematical Operator : ");
operator = input.next().charAt(0);
if (operator == '*' || operator == '/' || operator == '+' || operator == '-') {
System.out.print("Number 1: ");
no1 = input.nextFloat();
System.out.print("Number 2: ");
no2 = input.nextFloat();
switch (operator) {
case '*':
ans = no1 * no2;
break;
case '/':
ans = no1 / no2;
break;
case '+':
ans = no1 + no2;
break;
case '-':
ans = no1 - no2;
break;
}
System.out.println("The answer of " + no1 + operator + no2 + " = " + ans);
}
} while (operator == '*' || operator == '/' || operator == '+' || operator == '-');
}
}
答案 0 :(得分:3)
这是因为如果没有案例评估为true,则不会设置ans
的值。所以你不能使用它。
您可以通过添加default
案例并将ans
的值设置为0来解决此问题。
答案 1 :(得分:3)
Java要求在使用之前初始化所有局部变量。
在您的打印行中,您读取了abs
的值,但并非所有控制路径都为其设置了值。 (即使你认为你已经涵盖了switch
给出外部if
的所有可能性,编译器也不会看到这样的东西:其他一些线程可以修改operator
)。
因此,您的IDE /编译器建议您在声明时初始化它。
答案 2 :(得分:2)
您应初始化ans=0;
,因为default
没有ans
值,因此您需要对其进行初始化。
但是如果添加defualt值,则不需要像这样初始化它:
...
case '-':
ans = no1 - no2;
break;
default :
ans = someValue;
break;
答案 3 :(得分:2)
嗯,可能是没有任何case语句适用,结果ans
仍然是未初始化的。由于局部变量在使用之前必须进行初始化,因此会出现此错误。
答案 4 :(得分:2)
如果你没有初始化它,你的ans首先会有一个垃圾值。
初始化它不是强制性的。
但如果你初始化它,你的程序将是一个更好的程序。