2013-04-03 146 views
0

下面我有一段代碼,我不會工作。我在我的主要方法得到輸入,然後將該輸入傳遞到另一個方法來檢查驗證。但它並沒有真正檢查正確。如果我爲monthday輸入99,我希望它給我Check Month的消息。爲什麼我沒有得到正確的返回信息?

相反,我得到: THIS THIS

如果我的月輸入0299的一天,我希望它給我留言:Check day。相反,我得到THIS THIS

如果我輸入02兩個,我期望它運行並繼續運行其他方法。相反,我得到THIS THIS

public class Date { 

private Calendar parsedDate; 

public static void main(String[] args) 
{ 
    Date main = new Date(); 
     System.out.println("Enter a date (use the format -> (MM/DD/YYYY)"); 

    //declare Scanner 
    Scanner in = new Scanner (System.in); 

    System.out.println("Enter a month (MM): "); 
    String month = in.nextLine(); 

    System.out.println("Enter a day (DD): "); 
    String day = in.nextLine(); 

    System.out.println("Enter a year (YYYY): "); 
    String year = in.nextLine(); 

    if (main.isValidDate(month, day, year) == true) 
    { 
     main.newFormat(month, day, year); 
     main.isLeapYear(year); 
     main.dayNumber(month, day); 
    } 
    else if (main.isValidDate(month, day, year) == false) 
    { 
     System.out.println("Invalid Input"); 
    } 
}//end of main 

private boolean isValidDate(String month, String day, String year) 
{ 
    //check month  
    if(month == "01" || month == "03" || month == "04" || 
     month == "05" || month == "06" || month == "07" || month == "08" || 
     month == "09" || month == "10" || month == "11" || month == "12") 
    { 
     //check day 
     if(day == "01" || day == "02" || day == "03" || day == "04" || 
      day == "05" || day == "06" || day == "07" || day == "08" || 
      day == "09" || day == "10" || day == "11" || day == "12" || 
      day == "13" || day == "14" || day == "15" || day == "16" || 
      day == "17" || day == "18" || day == "19" || day == "20" || 
      day == "21" || day == "22" || day == "23" || day == "24" || 
      day == "25" || day == "26" || day == "27" || day == "28" || 
      day == "29" || day == "30" || day == "31") 
     { 
      return true; 
     } 
     else 
     { 
      System.out.println("Check Day"); 
      return false; 
     } 
    }//end of check month 
    else if (month == "02") 
    { 
     if (day == "28" || day == "29") 
     { 
      return true; 
     } 
    }//end of month 2 
    else 
    { 
     System.out.println("THIS"); 
     return false; 
    } 

    parsedDate = null;// if it's valid set the parsed Calendar object up. 
    return true; 
}//end of isValidDate 

回答

4

雖然解釋這是原因的答案目前不工作 - 使用==而非equals - 我建議你剛開始使用equals

相反,首先將用戶輸入解析爲數字,然後驗證那些......使用數字而不是字符串執行數字比較要容易得多。喜歡的東西:

private boolean isValidDate(int year, int month, int day) { 
    // Adjust for whatever bounds you want 
    if (year < 1900 || year > 2100) { 
     System.out.println("Check year"); 
     return false; 
    } 

    if (month < 1 || month > 12) { 
     System.out.println("Check month"); 
     return false; 
    } 

    Calendar calendar = Calendar.getInstance(); 
    calendar.clear(); 
    calendar.set(year, month - 1, 1); 
    if (day < 1 || day > calendar.getActualMaximum(Calendar.DAY_OF_MONTH)) { 
     System.out.println("Check day"); 
     return false; 
    } 
    calendar.set(Calendar.DAY_OF_MONTH, day); 
    // Store calendar somewhere if you want... 
    return true; 
} 

此外,我強烈如果可以的話建議使用Joda Time作爲一個好得多的日期/時間API。

編輯:你的下一個問題似乎是塊:

if (main.isValidDate(month, day, year) == true) 
{ 
    main.newFormat(month, day, year); 
    main.isLeapYear(year); 
    main.dayNumber(month, day); 
} 
else if (main.isValidDate(month, day, year) == false) 
{ 
    System.out.println("Invalid Input"); 
} 

現在我給出的代碼已經檢查一切構建了Calendar - 目前還不清楚是什麼的if塊的方法意味着要做。但你不需要再次撥打isValidDate。你只需要:

// Assuming you're using my new method... 
if (isValidDate(year, month, day)) { 
    // Do whatever you need to do 
} else { 
    System.out.println("Invalid input"); 
} 
+1

正如喬恩寫的,你應該聲明常量並以這種方式比較'if(month == JANUARY)'等。這更清楚。 – pepuch

+0

如果我輸入了錯誤的月份,它會打印兩次「Check Month」!爲什麼是這樣? –

+0

@DwellingPlace:那麼你現在調用'isValidDate'兩次。不要這樣做。 –

4

month == "01"不是在Java中比較String S上的正確方法。

您正試圖比較兩個變量的內存位置,這兩個變量不可能相同。您可以使用month.equals("01")

+0

我可以使用||那裏面? ie'month.equals(「01」||「02」|| 03)'? –

+0

@DwellingPlace No.事實上,JonSkeet給了你一個極好的建議。如果可以先解析值的'int'值,則可以比較範圍'如果(月> = 1 &&月<= 3){...}' – MadProgrammer

+0

哦,沒問題。我會檢查出來的!謝謝:) –

5

您應該使用equals方法來比較字符串。使用==運算符時,您會比較字符串的地址,而不是其內容。

+0

o。 DERP。 >。< 謝謝,我完全忘了! –

1

這將是更有效和更容易讀/寫/測試你的字符串轉換爲整數,然後檢查(例如使用int monthVal = Integer.parseInt(month); thenyou可以檢查(一)解析正常,周圍有一個try/catch和(B)試驗用if (monthVal > 0 && monthVal< 13) { /* month is good */}

+0

我明白了! 我仍然可以以同樣的方式返回嗎? –

+1

當然你可以:) –

+0

謝謝!我會改變它。 :D –

2

值有兩個大錯誤

  1. 您使用比較字符串等於平等,這將比較內存不滿足這樣 行if(month == "01")應該if("01".equals(month))

  2. 檢查有效日期if (main.isValidDate(month, day, year) == true)的情況應該是這樣if (main.isValidDate(month, day, year))

相關問題