2011-11-27 162 views
1
import java.util.Scanner; 

public class ZodiacSign{ 

     public static void main(String args[]){ 

     Scanner input = new Scanner(System.in); 
     int Feb,March,ZodiacSign,Pisces,Aquarius,Aries,Taurus; 

     int selection; 
     System.out.println("Feb"); 

     System.out.println("Feb 1,2,3,4\n Feb 5,6,7,8\n Feb 9,10,11,12\n Feb 13,14,15,16\n Feb 17,18,19,20\n Feb 21,22, 23, 24\n Feb25,26,27,28\n March 1,2,3,4\n March 5,6,7,8\n March 9,10,11,12\n March 13,14,15,16\n March17,18,19,20\n March 21,22,23,24\n March 25,26,27,28\n March 29,30,31"); 
     System.out.println("Please enter your date of birth"); 
     System.out.println("Please enter your month of birth"); 


     selection = input.nextInt(); 
     if(Feb>= 19){ 
      ZodiacSign = Pisces ; 
      System.out.println("Your zodiac sign is Pisces"); 
     } 
     else 
     { 
      System.out.println("Your zodiac sign is Aquarius"); 
     } 
     if(March>=22){ 
      ZodiacSign = Aries; 
      System.out.println("Your zodiac sign is Aries"); 
     } 
     else 
     { 
      System.out.println("Your zodiac sign is Taurus"); 
     } 
      System.out.println("End of Program"); 



     } 
} 

它給我的四個錯誤:變量可能尚未初始化

ZodiacSign.java:19:error: variable Feb might not have been initialized 
       if(Feb>= 19){ 
       ^
ZodiacSign.java:20:error: variable Pisces might not have been initialized 
         ZodiacSign= Pisces ; 
           ^
ZodiacSign.java:27:error: variable March might not have been initialized 
     if(March>= 22){ 
      ^
ZodiacSign.java:28:error: variable Aries might not have been initialized 
      ZodiacSign= Aries ; 
        ^

回答

-2

更改以下行

int Feb,March,ZodiacSign,Pisces,Aquarius,Aries,Taurus; 

int Feb=0,March=0,ZodiacSign=0,Pisces=0,Aquarius=0,Aries=0,Taurus=0; 

方法變量需要一些初始分配在使用之前。所以對所有其他方法變量也要這樣做。

+2

它們不需要默認值。在閱讀之前,他們必須被明確地分配 - 這不是一回事。 –

+0

是的,我同意。那更精確。我編輯了我的回覆。 – Santosh

+0

雖然我不認爲這是正確的做法。 (我也建議使用「局部變量」而不是「方法變量」這個更常見的術語。) –

7

你永遠不會指定值到Feb,那麼你期望這個比較實現什麼?

if (Feb >= 19) 

想想你真的實現與比較的東西,然後制定出你需要改變,使其發生什麼。

一般情況下,你不能從一個局部變量看它之前明確賦值 - 換句話說,直到編譯器可以證明,你會一直通過給它分配一個值,一些執行路徑。

但是,我並不是試圖用聲明中的值來編譯它,而是建議你仔細考慮一下整體設計。例如,您可能想要將雙魚座,白羊座等改爲枚舉值。

此外,Java代碼通常使用局部變量的名稱pascalCase

3

您正在閱讀從未寫入過的變量,例如,您從第一個if聲明中的Feb中讀取而沒有寫入任何內容。

此外,通過您的代碼的一些代碼路徑會使ZodiacSign局部變量未初始化,一旦您嘗試讀取該局部變量,就會產生相同的錯誤。就拿這一點:

if(Feb>= 19){ 
    ZodiacSign = Pisces ; 
    System.out.println("Your zodiac sign is Pisces"); 
} 
else 
{ 
    System.out.println("Your zodiac sign is Aquarius"); 
} 

如果Feb小於19 ZodiacSign不會一直寫的代碼片段的結束。第二個條件也可以將ZodiacSign未分配。

你缺少的是實際使用從輸入中讀取的值來設置局部變量。也就是說,在

selection = input.nextInt(); 

你應該selection使用該值一些有用的值賦給FebMarch等。然後還要確保ZodiacSign被分配,而不管哪個代碼路徑最終被佔用。

此外,這裏的算法存在一個基本問題。你不需要每個月都有一個變量。你的輸入只需要兩個變量:日期和月份,以及十二生肖的三分之一。