如何初始化变量?

问题描述:

所以我有一个程序,它会打印出你从用户给出的一个日期(包括闰年)中的天数。但是,当我编译程序时,它表示变量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); 

} 
} 

感谢您给予的任何帮助!

+2

总是使用大括号来表示“if else”。它会避免错误。 – basiljames

如果通过“运行程序”,你的意思是编译,你需要在所有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任何东西。

+0

这工作完美,谢谢你一堆。在开始我对花括号做了些什么之后,我仍然有点困惑,但是它已经清除了它!是的,我的意思是编译程序不运行。我的错误,我将它固定在OP中。非常感谢你,祝你有个美好的夜晚! – Phenom588

+2

+1,用于提取'if'问题 – MadProgrammer

+0

+1,其根本原因是预期(缩进:-))与实际if-then-else-logic之间的区别。酷:D – TheBlastOne

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

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

虽然Class字段初始化为默认值。有关更多信息,请参阅variables here,然后查看给定链接上的章节Primitive Data Types

+0

我试图设置它等于零,但它最后只是打印为零而不是根据月份和日期=/ – Phenom588

+4

user1645307更改,请参阅以下我的帖子。你错过了几个条件。例如,1995年3月1日将不会获得赋值,因为年%400!= 0。 – CrazyCasta

int month, day, year; 
int dayNumber; 

dayNumber = month = day = year = 0; 

这是对我而言有点矫枉过正,但至少它涵盖了所有的基地......

+1

没关系,每次downvote也会从那里获得代币;) – MadProgrammer

只要写:

int dayNumber = 0; 

所有局部变量,在Java中,必须initilized在首次使用之前。

+0

为什么会降低投票率? – Azodious

+0

应该有一条规则来检查必须提供前3个降价提示的原因。 – Azodious

+2

由于它是一个修复程序,可能会降低维护量,而不是解决方案。分配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什么,但不是第三一个?

+0

很遗憾,我无法在此作业中使用开关,但无论如何都谢谢您! – Phenom588

+2

这不会改变真正的问题:您有案件导致未分配dayNumber。 –

+2

没有降价。难怪! ;-) – TheBlastOne

你可以做int dayNumber=0;
你可能想知道为什么它是不是有monthdayyear。这是因为编译器发现,在使用这些属性之前,您正在为其分配值。但在dayNumber的情况下,您正在为条件循环设置值,并且在访问dayNumber以进行打印之前,有可能不会执行该值。