Java 如何初始化变量?
所以我有一个程序,它会打印出从用户给定的日期算起的一年中的天数,包括闰年。然而,当我编写程序时,它说变量dayNumber没有初始化。我该如何解决这个问题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
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
解决方案不是初始化intint 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:是的,我会努力增加回答的价值。谢谢。没关系,每一次否决票也会带走他们的代表;)