我已初始化并声明变量“average”。我不明白为什么它不会编译。它是否与其他情况有关?我已经试过了 “|| null”,这也没有。怎么办?
// declare variables
Scanner keyboard = new Scanner (System.in);
String given;
String middle;
String sur;
String truefalse;
boolean bool;
int exam1;
int exam2;
int exam3;
double average;
// get input
System.out.println("*************** Grade Computer *************");
System.out.println("Enter the student's first name: ");
given = keyboard.nextLine();
System.out.println( "Enter the student's middle initial: ");
middle = keyboard.nextLine();
System.out.println( "Enter the student's last name: ");
sur = keyboard.nextLine();
System.out.println( "Enter EXAM 1 Grade: ");
exam1 = keyboard.nextInt();
System.out.println( "Enter EXAM 2 Grade: ");
exam2 = keyboard.nextInt();
System.out.println( "Enter EXAM 3 Grade: ");
exam3 = keyboard.nextInt();
keyboard.nextLine();
System.out.println( "Bonus work completed [true/false]");
truefalse = keyboard.nextLine();
// adjust exam scores if necesssary
if (truefalse == "true")
{
bool = true;
exam1 = keyboard.nextInt();
exam2 = keyboard.nextInt();
exam3 = keyboard.nextInt();
}
else
{
average = ((exam1+exam2+exam3)/3);
}
为什么编译器说 “可变平均值可能尚未初始化”?
答案 0 :(得分:2)
您需要初始化average
。
编译器抱怨,因为您的代码可能会或可能不会到达else
块。但是,如果在未初始化时使用average
,则会出现错误。
double average = null;
或者,您也可以在average
块中初始化if
,因为如果if
块运行且else
不运行,您仍然会有在一天结束时初始化average
并且编译器很高兴:)。
if (truefalse == "true")
{
average = //something;
bool = true;
exam1 = keyboard.nextInt();
exam2 = keyboard.nextInt();
exam3 = keyboard.nextInt();
}
else
{
average = ((exam1+exam2+exam3)/3);
}
另外,作为最后一点,一个好的经验法则是对{t 1}}使用.equals()
,对于整数,字符,布尔值等使用String
。
答案 1 :(得分:2)
您声明了您的变量但没有严格初始化它。如果程序的逻辑指示行average = ((exam1+exam2+exam3)/3);
被命中,则仅初始化。如果truefalse == "true"
。
为了让Java编译它,你可以做两件事之一。
在声明变量时将变量初始化为某个默认值,例如double average = 0;
确保没有逻辑路径排除变量初始化的可能性。也就是说,无论发生了什么,它都会被初始化。
第一种选择更好。它使您的代码更清晰,更符合逻辑,从而更易于维护。第二个选项比显式更隐式。你可能不应该自己走过逻辑,看看它是如何工作的。
答案 2 :(得分:2)
您可以在声明时将双变量平均值初始化为0.
double average = 0;
此特定错误的原因是您尝试在if-else块中初始化变量。如果condition不为true,则不会初始化变量。如果您在程序中进一步使用该变量,则会出现运行时错误。这就是为什么Java编译器会让你知道变量可能未初始化的可能性
此外,在声明局部变量时初始化局部变量始终是一个好习惯。