下面我有一段我无法使用的代码片段。我在main方法中输入,然后将该输入传递给另一个方法以检查验证。但它并没有真正正确检查。如果我为99
和month
输入day
,我希望它会向我发送消息Check Month
。
相反,我得到:
THIS
THIS
如果我输入02
一个月和99
一天,我希望它能给我一条消息: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
答案 0 :(得分:5)
您应该使用equals方法来比较字符串。使用==
运算符时,您需要比较字符串的地址,而不是它们的内容。
答案 1 :(得分:4)
这个month == "01"
不是在Java中比较String
的正确方法。
您正在尝试比较两个不太可能相等的变量的内存位置。
相反,您应该使用month.equals("01")
。
答案 2 :(得分: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");
}
答案 3 :(得分:2)
有两个大错误
你正在比较字符串和等于等于比较内存而不是内容的字符串
第if(month == "01")
行应为if("01".equals(month))
检查有效日期if (main.isValidDate(month, day, year) == true)
的条件应该类似于if (main.isValidDate(month, day, year))
答案 4 :(得分:1)
将字符串转换为整数,然后检查(例如,使用int monthVal = Integer.parseInt(month);
,然后你可以检查(a)它是否正确解析,尝试/将更高效,更容易读/写/测试抓住它并(b)用if (monthVal > 0 && monthVal< 13) { /* month is good */}