2013-04-03 150 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))

相关问题