2016-02-18 193 views
-1

对于我的科学类我必须编写一个程序来查找给定月份(1-12)中的天数,是否知道为什么我会收到错误“变量天可能没有被初始化“当试图从交换机返回int”天“?下面的代码:因为month作为参数传递给函数提供变量可能未被初始化

public static int getNumberofDays(int month,int year) 
    { 
     // Imports the required Scanner 
     Scanner kbd = new Scanner(System.in); 

     final String month; 
     final int days; 
     switch (month) { 
     case 1: days = 31; 
      break; 
     case 2: if ((year % 4 == 0) && year % 100 != 0) 
        { 
        days = 29; 
        } 
        else if ((year % 4 == 0) && (year % 100 == 0) && (year % 400 == 0)) 
        { 
        days = 29; 
        } 
        else 
        { 
        days = 28; 
        } 
      break; 
     case 3: days = 31; 
      break; 
     case 4: days = 30; 
      break; 
     case 5: days = 30; 
      break; 
     case 6: days = 31; 
      break; 
     case 7: days = 31; 
      break; 
     case 8: days = 31; 
      break; 
     case 9: days = 30; 
      break; 
     case 10: days = 31; 
      break; 
     case 11: days = 30; 
      break; 
     case 12: days = 31; 
      break; 
     default: month = "invalid"; 
      break; 
     } 
     return days; 
    } 
+1

您发布的代码不准确。这引发了一个不同的编译错误。 –

+0

多么棘手的问题!一种方法犯了很多错误,非常酷! – radoh

回答

0
  1. final String month;是无效的。

  2. 您并未在所有控制路径上初始化days:您的switch中的default块不会执行此操作。这是Java的一个很好的功能,因为它可以帮助您实现程序的稳定性。没有什么比编译器更好告诉你该怎么做。 不要强行通过书面编号final int days = 0;;而是在default块中为其分配一个值。

+0

我需要一杯咖啡吗? – Bathsheba

+0

对我来说很好。 – Neil

+0

特别是现在我更仔细地阅读了这个程序 – Bathsheba

6

为什么我收到错误 “变量天可能尚未初始化”

因为:

final int days; 

应该是:

int days = 0; 

为什么?

  • 变量的方法应该初始化
  • 最终变量不能被修改。

其他错误:

  • 你不覆盖month所有可能的值switch
  • 你定义一个String month,阴影参数int month
  • Scanner未使用
  • 更多... XD

用自己的方式

另外,如果你不破的情况下,块下一个将被执行

我的解决方案,这意味着你可以这样做:

public static int getNumberofDays(int month,int year) { 
    switch (month) { 
     case 1: 
     case 3: 
     case 6: 
     case 7: 
     case 8: 
     case 10: 
     case 12: 
      days = 31; 
      break; 
     case 4: 
     case 5: 
     case 9: 
     case 11: 
      days = 30; 
      break; 
     case 2: 
      if ((year % 4 == 0) && year % 100 != 0) 
      { 
      days = 29; 
      } 
      else if ((year % 4 == 0) && (year % 100 == 0) && (year % 400 == 0)) 
      { 
      days = 29; 
      } 
      else 
      { 
      days = 28; 
      } 
      break; 
     default: days = -1; 
      break; 
    } 
    return days; 
} 

我的解决方案:Calendar!:

public static int getNumberofDays(int month,int year) 
{ 
    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.MONTH, month); 
    cal.set(Calendar.YEAR, year); 
    return cal.getActualMaximum(Calendar.DAY_OF_MONTH); 
} 

Neil溶液:Java-8

public static int getNumberofDays(int month,int year) 
{ 
    YearMonth yearMonthObject = YearMonth.of(year, month); 
    return yearMonthObject.lengthOfMonth(); 
} 
+1

你的重复任务很丑,意味着你不能再使用'final'。 – Bathsheba

+0

@尼尔同意,复制粘贴错误,修改! –

+0

@Bathsheba我不使用final,但同意重复声明...我的错误和修复 –

-1

的问题是,所述days变量不具有开关的default子句中分配给它的任何值。 如果交换机属于默认部分,那么它将不会被初始化。

在声明时初始化days或在默认开关块中分配一个值。

否则,如果您的设计允许,请在默认子句中引发异常。

-2

添加days = 0;到默认情况下,因为这样的:

default: 
    month = "invalid"; 
    days = 0; 
     break; 

你必须给days值某处的代码路径,你试图返回它之前。您还应该用int days;替换final int days;。 另外,你不能有final String month,因为month作为参数传递给函数..只是删除month的重新声明,你是黄金。

+0

它会解决它,但解释为什么会很好。编辑:我回来,这只会解决两个问题之一。 – Neil

+0

咄。我需要我的早晨咖啡以及 – mike

+0

还好还好容易与downvotes ..哈哈番 – mike

1

并非所有可能的路径都通过您的代码为days变量赋值。确切地说,默认块没有。

default: month = "invalid"; 
      break; 

如果将其更改为

default: month = "invalid"; 
     days=0 
      break; 

,报警信号消失。

我的其他问题是:

  • 为什么你定义一个String一个月,从而遮蔽参数一个月?
  • 扫描仪的用途是什么?
  • 为什么你在默认块中将月份分配为无效,你永远不会返回它。