2013-03-07 89 views
1

我一直收到一個錯誤變量F3可能沒有初始化在你看到的最後一行代碼上。在java中的if語句中初始化一個變量?

我在做什麼錯?

{ 
    Float F1,F2, F3; 

    F1 = Float.parseFloat(
     JOptionPane.showInputDialog("Enter a number and press ok.")); 


    F2 = Float.parseFloat(
     JOptionPane.showInputDialog("Enter a second number and press ok.")); 

    if(F1 >= F2) 
    { 

     F3=(F1 * F2) + (F1 * 2); 
    } 
    if(F2 >= F1) 
    { 
     F3 =(F1 + F2) + (F2 * 5); 
    } 

    DecimalFormat dec = new DecimalFormat("##.##"); 


    JOptionPane.showMessageDialog(null,"Your calculations are:" +(F3),"Caculations", JOptionPane.INFORMATION_MESSAGE); 
+4

請勿使用以大寫字母開頭的變量名稱。堅持命名約定。 – 2013-03-07 15:53:44

回答

2

按照JLS的情況下:必須有一個明確 指定值時

每一個局部變量和每一個空白的最後一個字段其價值的任何訪問發生。

另外從§14.4.2

如果聲明符不具有初始化表達式,然後每 參考變量必須由 賦值給變量的執行,一個或編譯期前面發生時間錯誤。

隨着代碼的出現,有可能在它被使用之前(代碼片段的最後一行)沒有任何東西被分配到F3。使用F3 = null

+0

Float F1,F2,F3 = null;它的工作表示感謝 – TitanC 2013-03-07 16:14:20

+0

局部變量可以保持未初始化。問題在於編譯器如何看到它不能清楚理解的條件,以便知道變量始終會用值初始化。 – 2013-03-07 16:18:38

+0

我如何避免將來? – TitanC 2013-03-07 16:22:08

8

你或許應該使用的if/else代替如果/當這裏,讓編譯器知道F3總是被設置爲一個值。

下面的代碼就相當於你的if/if語句:

if(F1 > F2) //The = here will always be overridden by the other if clause in your original statement so it's redundant. 
{ 
    F3=(F1 * F2) + (F1 * 2); 
} 
else 
{ 
    F3 =(F1 + F2) + (F2 * 5); 
} 
+0

我被告知我必須使用兩個if語句,否則我會這樣做 – TitanC 2013-03-07 16:10:29

0

當你聲明一個變量F3 null分配給它。因爲你如果條件有可能是這個變量不會被分配任何價值

+1

實際上它總是會被分配一個值,只是編譯器不夠聰明而無法看到它。 – ddmps 2013-03-07 16:05:11

+0

你說得對。沒有注意到 – jonasnas 2013-03-07 16:13:39

1

您的代碼就相當於:

if(F1 > F2) { 
    F3 = (F1 * F2) + (F1 * 2); 
} else { 
    F3 = (F1 + F2) + (F2 * 5); 
} 

這應該讓錯誤消失。

0

試試這個

Float F1=0,F2=0, F3=0; 
0

最好的辦法是使用if-else語句,並沒有分配到空的變量。如果else語句對人類和編譯器更好。指定null是沒有意義的,並且使編譯器無法檢查未初始化的問題以便將來進行修改,如果不檢查它,則可能會得到NullPointerException。