[英]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.