簡體   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