3

所以我有一个程序可以打印出你从用户给定的日期到一年中的天数,其中包括闰年。但是,当我编译程序时,它说变量 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:这只会隐藏真正的错误

解决方案不是初始化 intint 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 )

如果前两个测试为真但第三个不为真,那么 dayNumber 会发生什么?

于 2012-09-25T06:38:21.950 回答
0

就像int dayNumber=0;,您还需要初始化其他变量(month, day, year)。不完全为 0,您可以将其初始化为其他默认值(请参阅@dystroy 的答案)。

在java中,如果变量是本地的,那么你必须初始化它们,否则你会得到编译器错误。

而类字段被初始化为其默认值。有关更多信息,请参见此处的变量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 回答
0

你可以这样做int dayNumber=0;
你可能想知道为什么它不存在month,dayyear。这是因为编译器发现,对于这些属性,您在使用它们之前为其分配了值。但是,如果您在条件循环中为其设置值,并且在访问打印dayNumber之前可能无法执行它。dayNumber

于 2012-09-25T06:42:14.470 回答