0

以下に、動作しないコードのスニペットがあります。メイン メソッドで入力を取得し、その入力を別のメソッドに渡して検証を確認します。しかし、実際には正しくチェックされません。を入力99monthday、メッセージが表示されることを期待している場合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
4

5 に答える 5

5

文字列の比較には equals メソッドを使用する必要があります。演算子を使用する場合==、文字列の内容ではなくアドレスを比較します。

于 2013-04-03T05:55:14.510 に答える
4

これは、Java で smonth == "01"を比較する正しい方法ではありません。String

2 つの変数のメモリ位置を比較しようとしていますが、これらは等しくない可能性があります。

代わりに、を使用する必要がありますmonth.equals("01")

于 2013-04-03T05:54:20.253 に答える
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;
}

さらに、可能であれば、より優れた日付/時刻 API としてJoda Timeを使用することを強くお勧めします。

編集:次の問題はこのブロックのようです:

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");
}

ここで提示したコードは、すでにすべてをチェックしてa構築しています。ブロック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");
}
于 2013-04-03T05:57:28.183 に答える
2

大きな間違いが2つ

  1. 文字列をequals equalsと比較しているため、コンテンツではなくメモリを比較するため、行 if(month == "01")は次のようになりますif("01".equals(month))

  2. 有効な日付をチェックする条件は次のif (main.isValidDate(month, day, year) == true)ようになります if (main.isValidDate(month, day, year))

于 2013-04-03T06:04:40.923 に答える