3

そのため、うるう年を含む、ユーザーが指定した日付からの 1 年間の日数を出力するプログラムがあります。ただし、プログラムをコンパイルすると、変数 dayNumber が初期化されていないと表示されます。これを修正するにはどうすればよいですか?

import java.util.Scanner;

public class Days
{
public static void main( String [] args )
{
    Scanner scan = new Scanner(System.in);
    int month, day, year;
    int dayNumber;

    System.out.print("Enter the month: ");
    month = scan.nextInt();
    System.out.print("Enter the day: ");
    day = scan.nextInt();
    System.out.print("Enter the year: ");
    year = scan.nextInt();

    if ( month == 1 )

        dayNumber = day;

    else if ( month == 2 )

        dayNumber = 31 + day;   

    else if ( month == 3 )

        if ( year % 400 == 0 )

            if ( year % 4 == 0 && year % 100 != 0 )

                dayNumber = 31 + 29 + day;


        else

            dayNumber = 31 + 28 + day;



    else if ( month == 4 )

        if ( year % 400 == 0 )

            if ( year % 4 == 0 && year % 100 != 0 )

                dayNumber = 31 + 29 + 31 + day;


        else

            dayNumber = 31 + 28 + 31 + day;



    else if ( month == 5 )

        if ( year % 400 == 0 )

            if ( year % 4 == 0 && year % 100 != 0 )

                dayNumber = 31 + 29 + 31 + 30 + day;


        else

            dayNumber = 31 + 28 + 31 + 30 + day;


    else if ( month == 6 )

        if ( year % 400 == 0 )

            if ( year % 4 == 0 && year % 100 != 0 )

                dayNumber = 31 + 29 + 31 + 30 + 31 + day;


        else

            dayNumber = 31 + 28 + 31 + 30 + 31 + day;


    else if ( month == 7 )

        if ( year % 400 == 0 )

            if ( year % 4 == 0 && year % 100 != 0 )

                dayNumber = 31 + 29 + 31 + 30 + 31 + 30 + day;


        else

            dayNumber = 31 + 28 + 31 + 30 + 31 + 30 + day;


    else if ( month == 8 )

        if ( year % 400 == 0 )

            if ( year % 4 == 0 && year % 100 != 0 )

                dayNumber = 31 + 29 + 31 + 30 + 31 + 30 + 31 + day;


        else

            dayNumber = 31 + 28 + 31 + 30 + 31 + 30 + 31 + day;


    else if ( month == 9 )

        if ( year % 400 == 0 )

            if ( year % 4 == 0 && year % 100 != 0 )

                dayNumber = 31 + 29 + 31 + 30 + 31 + 30 + 31 + + 31 + day;


        else

            dayNumber = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + day;


    else if ( month == 10 )

        if ( year % 400 == 0 )

            if ( year % 4 == 0 && year % 100 != 0 )

                dayNumber = 31 + 29 + 31 + 30 + 31 + 30 + 31 + + 31 + 30 + day;


        else

            dayNumber = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day;


    else if ( month == 11 )

        if ( year % 400 == 0 )

            if ( year % 4 == 0 && year % 100 != 0 )

                dayNumber = 31 + 29 + 31 + 30 + 31 + 30 + 31 + + 31 + 30 + 31 + day;


        else

            dayNumber = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day;


    else 

        if ( year % 400 == 0 )

            if ( year % 4 == 0 && year % 100 != 0 )

                dayNumber = 31 + 29 + 31 + 30 + 31 + 30 + 31 + + 31 + 30 + 31 + 30 + day;


        else

            dayNumber = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day;


    System.out.println("The date " + month + "/" + day + "/" + year + " is day number " + dayNumber);

}
}

あなたが与えることができるどんな助けにも感謝します!

4

6 に答える 6

6

「プログラムを実行する」がコンパイルを意味する場合は、すべての if ステートメントの前に dayNumber を何かに設定する必要があります。あなたのタブ操作は、if/else ステートメントを完全に理解していないことを示唆しているとは限りません。例えば:

    if ( year % 400 == 0 )
        if ( year % 4 == 0 && year % 100 != 0 )
            dayNumber = 31 + 29 + day;
    else
        dayNumber = 31 + 28 + day;

else は最後の if (この場合 year % 4 == 0 && year % 100 != 0) に接続されています。これが必要でない場合は、次のものが必要です。

    if ( year % 400 == 0 )
    {
        if ( year % 4 == 0 && year % 100 != 0 )
            dayNumber = 31 + 29 + day;
    }
    else
        dayNumber = 31 + 28 + day;

dayNumber を何にも設定しないことに注意してください。

于 2012-09-25T06:38:58.747 に答える
3

これは、変数を初期化していないパスがある可能性があることをコンパイラが検出したためです。

してはいけないことint dayNumber=0:これは本当のバグを隠すだけです

解決策はint を初期化することではなくint dayNumber=0、コードをチェックすることです。

そのためには、コードを読みやすくします。switchそれらの代わりに使用することをお勧めしますif

switch (month) {
case 1:
    ...
    break;
case 2:
...

そして、コードのこの部分について少し考えてみてください:

else if ( month == 3 )
    if ( year % 400 == 0 )
        if ( year % 4 == 0 && year % 100 != 0 )

最初の 2 つのテストが true で、3 番目のテストが true でない場合、 dayNumber はどうなりますか?

于 2012-09-25T06:38:21.950 に答える
0

あなたができることint dayNumber=0;
あなたはなぜそれが、、そしてのためmonthにそこにないのか疑問に思うかもしれません。これは、コンパイラが、これらの属性に対して、使用される前に値を割り当てていることを検出するためです。ただし、条件付きループで値を設定していて、印刷のためにアクセスされる前に実行されない可能性がある場合。dayyeardayNumberdayNumber

于 2012-09-25T06:42:14.470 に答える
0

のようint dayNumber=0;に、他の変数も初期化する必要があります( month, day, year)。正確には0ではなく、他のデフォルト値に初期化できます(@dystroyの回答を参照)。

Java では、変数がローカルの場合、変数を初期化する必要があります。そうしないと、コンパイラ エラーが発生します。

Class フィールドはデフォルト値に初期化されます。詳細については、ここで変数Primitive Data Typesを参照してください。特定のリンクの次の章も確認してください。

于 2012-09-25T06:36:35.960 に答える
0
int month, day, year;
int dayNumber;

dayNumber = month = day = year = 0;

私の側では少しやり過ぎですが、少なくともすべてのベースをカバーしています...

于 2012-09-25T06:37:47.603 に答える
0

書くだけ:

int dayNumber = 0;

Java のすべてのローカル変数は、最初に使用する前に初期化する必要があります。

于 2012-09-25T06:38:11.823 に答える