Java 如何初始化变量?

Java 如何初始化变量?,java,Java,所以我有一个程序,它会打印出从用户给定的日期算起的一年中的天数,包括闰年。然而,当我编写程序时,它说变量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 dayN

所以我有一个程序,它会打印出从用户给定的日期算起的一年中的天数,包括闰年。然而,当我编写程序时,它说变量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);

}
}

谢谢你能给予的任何帮助

简单为
int dayNumber=0,您还需要初始化其他变量(
月、日、年
)。不完全是0,您可以将其初始化为其他默认值(请参阅@dystroy的答案)

在java中,如果变量是本地变量,则必须对其进行初始化,否则将出现编译器错误

而类字段则初始化为其默认值。有关更多信息,请参见给定链接的下一章
基本数据类型
章节

int month, day, year;
int dayNumber;

dayNumber = month = day = year = 0;
这对我来说有点过分了,但至少它涵盖了所有的基础…

只要写:

int dayNumber = 0;

Java中的所有局部变量在首次使用之前都必须初始化。

这是因为编译器检测到您可能有一个路径没有初始化变量

不要执行
int dayNumber=0
:这只会隐藏真正的bug

解决方案不是初始化int
int dayNumber=0,而是检查代码

为了能够做到这一点,请使代码可读。如果
,我建议您使用
开关
,而不是那些

switch (month) {
case 1:
    ...
    break;
case 2:
...
再想想你代码的这一部分:

else if ( month == 3 )
    if ( year % 400 == 0 )
        if ( year % 4 == 0 && year % 100 != 0 )
如果前两个测试是真的,而第三个测试不是真的,那么dayNumber会发生什么情况?

如果“运行程序”是指编译,则需要在所有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(在本例中,年份%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设置为任何值。

您可以执行
int dayNumber=0

您可能想知道为什么它在
没有出现。这是因为编译器发现,在使用这些属性之前,您正在为它们赋值。但是如果是
dayNumber
,您正在条件循环中为它设置值,在访问
dayNumber
进行打印之前,它可能无法执行。

我尝试将它设置为零,但最后它只是打印为零,而不是根据月份和日期进行更改=/user1645307,见下面我的帖子。您缺少几个条件。例如,1995年3月1日将不会被指定值,因为年份%400!=0.很遗憾,我无法在此作业中使用switch,但无论如何,谢谢您!这并没有改变真正的问题:你有导致未分配日数的案例。这非常有效,谢谢你。一开始我对花括号的作用还是有点困惑,但这就澄清了问题!是的,我的意思是编译程序而不是运行。我的错误,我在OP中修正了。非常感谢你,祝你度过一个美好的夜晚+确实,根本原因是预期(缩进:-)和实际if-then-else逻辑之间的差异。酷:DAlways为你的
if else
使用大括号。这将避免错误。应该有一个规则来检查前3个否决票必须提供理由。可能是否决票,因为这是一个修复,而不是一个解决方案。分配0而不是完全不分配任何内容,因此仅消除错误消息可能无法计算正确的结果。我同意,但我尝试回答问题,而不是为OP解决问题。@Azodious,为了使此有用,需要OP知道OP不知道的内容,以便OP可以提出正确的问题。大多数问题问的是症状,而不是根本原因,所以我真的建议你找出问题背后的问题,并回答这两个问题。只有我的2美分。@Theblatone:是的,我会努力增加回答的价值。谢谢。没关系,每一次否决票也会带走他们的代表;)