如何初始化变量?
所以我有一个程序,它会打印出你从用户给出的一个日期(包括闰年)中的天数。但是,当我编译程序时,它表示变量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);
}
}
感谢您给予的任何帮助!
如果通过“运行程序”,你的意思是编译,你需要在所有if语句之前设置dayNumber。你不应该认为你的标签表明你完全不理解if/else语句。例如:
if (year % 400 == 0)
if (year % 4 == 0 && year % 100 != 0)
dayNumber = 31 + 29 + day;
else
dayNumber = 31 + 28 + day;
的其他连接到最后,如果(在这种情况下,今年4%== 0 & &年100%!= 0)。如果这不是你想要的,那么你将需要:
if (year % 400 == 0)
{
if (year % 4 == 0 && year % 100 != 0)
dayNumber = 31 + 29 + day;
}
else
dayNumber = 31 + 28 + day;
它应该注意,不会设置dayNumber任何东西。
这工作完美,谢谢你一堆。在开始我对花括号做了些什么之后,我仍然有点困惑,但是它已经清除了它!是的,我的意思是编译程序不运行。我的错误,我将它固定在OP中。非常感谢你,祝你有个美好的夜晚! – Phenom588
+1,用于提取'if'问题 – MadProgrammer
+1,其根本原因是预期(缩进:-))与实际if-then-else-logic之间的区别。酷:D – TheBlastOne
简单地作为int dayNumber=0;
,您还需要初始化其他变量(month, day, year
)。不完全为0,您可以将其初始化为其他默认值(请参阅@ dystroy的答案)。
在java中,如果变量是局部的,那么你必须初始化它们,否则你会得到编译器错误。
虽然Class字段初始化为默认值。有关更多信息,请参阅variables here,然后查看给定链接上的章节Primitive Data Types
。
我试图设置它等于零,但它最后只是打印为零而不是根据月份和日期=/ – Phenom588
user1645307更改,请参阅以下我的帖子。你错过了几个条件。例如,1995年3月1日将不会获得赋值,因为年%400!= 0。 – CrazyCasta
int month, day, year;
int dayNumber;
dayNumber = month = day = year = 0;
这是对我而言有点矫枉过正,但至少它涵盖了所有的基地......
没关系,每次downvote也会从那里获得代币;) – MadProgrammer
只要写:
int dayNumber = 0;
所有局部变量,在Java中,必须initilized在首次使用之前。
为什么会降低投票率? – Azodious
应该有一条规则来检查必须提供前3个降价提示的原因。 – Azodious
由于它是一个修复程序,可能会降低维护量,而不是解决方案。分配0而不是根本不分配任何东西,因此只是抑制错误消息可能不会计算正确的结果。 – TheBlastOne
这是因为编译器检测到你可能有一个路径没有初始化变量。
不要做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)
如果前两个测试是真实发生dayNumber什么,但不是第三一个?
很遗憾,我无法在此作业中使用开关,但无论如何都谢谢您! – Phenom588
这不会改变真正的问题:您有案件导致未分配dayNumber。 –
没有降价。难怪! ;-) – TheBlastOne
你可以做int dayNumber=0;
你可能想知道为什么它是不是有month
,day
和year
。这是因为编译器发现,在使用这些属性之前,您正在为其分配值。但在dayNumber
的情况下,您正在为条件循环设置值,并且在访问dayNumber
以进行打印之前,有可能不会执行该值。
总是使用大括号来表示“if else”。它会避免错误。 – basiljames