2016-10-16 48 views
0

我正在嘗試收集有關月份相對於日期有多遠的信息。如何在「if」或「else」語句之後收集信息

我首先讓用戶輸入他們想要使用的月份。

Scanner uMonth = new Scanner(System.in); 

String tMonth = uMonth.next(); 
    if (tMonth.equals("January")){ 
     int eMonth = 1; 
    }else if (tMonth.equals("February")){ 
     int eMonth = 2; 
    }else if (tMonth.equals("March")){ 
     int eMonth = 3; 
    }else if (tMonth.equals("April")){ 
     int eMonth = 4; 
    }else if (tMonth.equals("May")){ 
     int eMonth = 5; 
    }else if (tMonth.equals("June")){ 
     int eMonth = 6; 
    }else if (tMonth.equals("July")){ 
     int eMonth = 7; 
    }else if (tMonth.equals("August")){ 
     int eMonth = 8; 
    }else if (tMonth.equals("September")){ 
     int eMonth = 9; 
    }else if (tMonth.equals("October")){ 
     int eMonth = 10; 
    }else if (tMonth.equals("November")){ 
     int eMonth = 11; 
    }else if (tMonth.equals("December")){ 
     int eMonth = 12; 

那麼對於第二個日期相同,除了我用一個新的Scanner 和使用tMonth2和uMonth2下一個變量。

我嘗試在循環外部使用eMonth變量時出現問題。

int finalMonths = int(eMonth - eMonth2);{ 
if (finalMonths < 0); 
finalMonths = (eMonth2 - eMonth); 

有什麼我失蹤了嗎? 我可以不使用循環內部的變量嗎? 是否有一些額外的步驟我失蹤?

謝謝。

+0

分享完整的代碼,我在這段代碼中看不到任何循環。 – saurav

+0

如果你已經在循環中聲明瞭eMonth變量,那麼它在循環的外部將不可見。正如@saurav提到的那樣,請分享完整的代碼 – Gihanmu

+0

我只是想提一下這個以防萬一你在將來做這樣的事情。最新版本的java支持開關外殼字符串。 –

回答

5

變量只在聲明的塊中有效。因此,你必須變量移動到外部範圍,以便從兩個安裝部分和計算部分訪問:

int eMonth; // variable declaration in the outer scope 
... 
String tMonth = uMonth.next(); 
if (tMonth.equals("January")){ 
    eMonth = 1; // only assignment, not declaration 
} 
... 
int finalMonths = int(eMonth - eMonth2); 
... 
+0

是的,我在閱讀本文之前發現了聲明變量。 –

+0

不幸的是,我的編譯器仍然告訴我,我沒有「初始化」它們。但是謝謝! –

+1

@AngelEscobedo:你需要在所有的'if' **和**'else'塊中初始化它,或者在聲明中初始化它:'int eMonth = 0; //一些默認值。 –

0

我對你所創建的代碼中看到的主要問題是使用長的if else不是那麼可讀。作爲乾淨的代碼建議,我建議使用Enum類來代替。

使用下面的代碼爲例:

enum MonthEnum { 

JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER; 

    static Integer getValue(MonthEnum monthEnum) { 
     return monthEnum.ordinal()+1; 
    } 
} 

在您希望使用的枚舉值作爲整數任何地方,你可以使用以下命令:

Integer eMonth = MonthEnum.getValue(MonthEnum.APRIL) 

,在任何您希望使用Enum值的地方爲字符串,您可以使用以下內容:

String eMonth = MonthEnum.getValue(MonthEnum.APRIL).toString() 

使用Enum將防止錯誤,因爲您使用代碼導致變量的初始化超出了if else語句。而且您可以看到代碼大小的差異,它更清晰明瞭。

使用Enum類的另一個好理由是變量是static所以它在內存決策方面更有效率。

有關Java Enums的更多詳情。

+0

我認爲這是回答變量的範圍混淆的問題,當使用主要代碼的if else部分分離比混淆解決。並且所有變量都保存在一個部分中。 – Rotem