[英]Why does Java say my variable is not initialized when it is?
所以我在程序中遇到了这个错误:
BankChargesWilson.java:55: error: variable checksCost might not have been initialized
System.out.println("Your total cost is " + money.format(checksCost) + ".");
^
1 error
但是我不明白为什么当我创建格式化对象并更早地初始化了checksCost变量时。
这是对象+我的定义。
// Decimal Format Object
DecimalFormat money = new DecimalFormat("$##,###.##");
// Scanner Object for Input
Scanner keyboard = new Scanner (System.in);
// Variables
double baseFee = 10.00; // The base fee the bank requires for the account
double checkFee; // The fee for a check
int checksWritten; // The users inputted amount of checks written for the month
double checksCost; // The cost for the checks based on the amount written in the month
这是我的else-if语句的使用位置,以及导致错误的输出和提示。
if (checksWritten < 20)
{
checksCost = checksWritten * 0.10;
}
else if (checksWritten >= 20 && checksWritten <= 39)
{
checksCost = checksWritten * 0.08;
}
else if (checksWritten >= 40 && checksWritten <= 59)
{
checksCost = checksWritten * 0.06;
}
else if (checksWritten >= 60)
{
checksCost = checksWritten * 0.04;
}
System.out.println("You entered that you wrote " + checksWritten + " checks this month.");
System.out.println("Your total cost is " + money.format(checksCost) + ".");
我不确定为什么要说它不再初始化了。
不过,问题是:checksCost是否仅在我的if-else-if循环范围内显示? 如果是这样,那么在上面进一步定义时又会如何呢?
因为编译器没有像您想象的那样深入分析您的代码。
尽管您的if/else
链肯定会根据其条件执行分支,但是编译器无法实现这一结果,编译器会抱怨您缺少else
条件。
您可以通过初始化变量来解决问题,也可以通过将else if
为简单的else
(在这种情况下不会改变语义)。
您需要提供一个默认的初始值,或者您必须提供else
块并在那里提供您的值。
原因是,您的所有条件都无法执行怎么办?
当您提供else块时,那么可以确保总是有机会在if
或in else
分配该值。
双重检查
if(){ //false
}
else if(){ //false
}
现在的checksCost
值是checksCost
?
是的,您的checksCost变量仅在初始化它的块内可见(在这种情况下,在for循环的各部分内)。
即使已经在上面声明了它,也可以在if-else语句的块内看到它的原因是,因为内部块可以访问自身外部的代码,但事实并非如此。
您需要为checksCost变量设置一个初始值。 可能会出现从未设置过该值的情况。 在某些情况下,您的任何条件逻辑都不会受到影响。
Java编译器要求必须初始化变量。 在编译时,它不会检查代码的逻辑,因此认为如果“ else if”都不匹配,则变量有可能不会被初始化。 您需要在if / else部分之前初始化checkCost,或者将else {double = smth; }结束if / else子句。
如果checksWritten
等于0
, checksCost
应该等于多少? 初始化checksCost
。 同样,您可能应该将checksWritten
初始化为0
。 也不要离开else
块,因为它会导致您刚刚发现的易碎代码。 因此,在这种情况下,只需将最后一个else if
更改为else
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.