繁体   English   中英

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

[英]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等于0checksCost应该等于多少? 初始化checksCost 同样,您可能应该将checksWritten初始化为0 也不要离开else块,因为它会导致您刚刚发现的易碎代码。 因此,在这种情况下,只需将最后一个else if更改为else

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM