为什么Java说我的变量没有被初始化?

时间:2014-02-17 03:59:54

标签: java loops

所以我的程序中出现了这个错误:

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) + ".");

我不确定为什么它说它不再被初始化了。

问题:仅在if-else-if循环的范围内看到checksCost吗?如果是这样,那么在上面进一步定义的时候怎么样?

6 个答案:

答案 0 :(得分:3)

因为编译器没有像你想象的那样深入分析你的代码。

虽然你的if/else链会根据条件确定执行分支,但是编译器没有意识到这个结果,抱怨你错过了else条件。

您可以通过初始化变量或让最后else if为简单else来解决问题(在这种特定情况下不会改变语义)。

答案 1 :(得分:2)

您需要提供默认初始值,或者您必须提供else阻止并在那里提供您的价值。

原因是,所有条件都无法执行会发生什么?

当您提供else块时,可以确保始终有机会在ifelse

中分配值

双重检查成本;

if(){  //false
}
else if(){ //false

}

现在checksCost值是什么?

答案 2 :(得分:2)

是的,您的checksCost变量只能在初始化的块内看到(在这种情况下,在for循环的部分内)。

在if-else语句的块中可以看到它的原因,即使它已经在上面声明了,因为内部块可以访问自己以外的代码,但反之则不然。

答案 3 :(得分:0)

您需要为checksCost变量设置初始值。可能存在值永远不会被设置的情况。可能存在没有任何条件逻辑被击中的情况。

答案 4 :(得分:0)

Java编译器要求必须初始化变量。在编译时,它不会检查代码的逻辑,因此它认为如果没有“else if”匹配,则变量不会被初始化。 你需要在if / else部分之前初始化checkCost,或者放一个else {double = smth;结束if / else子句。

答案 5 :(得分:0)

如果checksWritten等于0 checksCost应该等于什么?将checksCost初始化为该值。同样,您应该将checksWritten初始化为0。也不要忘记else块,因为它会导致您刚刚发现的脆弱代码。因此,在这种情况下,只需将上一个else if更改为else