【问题标题】:Variable might not have been initialized [duplicate]变量可能尚未初始化[重复]
【发布时间】:2016-02-18 15:23:51
【问题描述】:

对于我的 Comp Sci 课程,我必须编写一个程序来查找给定月份 (1-12) 中的天数,你知道为什么我会收到错误“可变天数可能尚未初始化" 当试图从交换机返回 int "days" 时?代码如下:

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;
   }

【问题讨论】:

  • 您发布的代码不准确。这会引发不同的编译错误。
  • 多么棘手的问题!一种方法有这么多错误,太酷了!

标签: java variables initialization


【解决方案1】:

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

因为:

final int days;

应该是:

int days = 0;

为什么?

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

其他错误:

  • 您没有涵盖switchmonth 的所有可能值
  • 你定义一个String month,隐藏参数int month
  • Scanner 未使用
  • 还有更多... XD

我的解决方案用你的方式

另外,如果你不破坏一个 case 块,下一个将被执行,这意味着你可以这样做:

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();
}

【讨论】:

  • 你重复的分配很丑陋,意味着你不能再使用final
  • @Neil 同意,复制粘贴错误,已修改!!
  • @Bathsheba 我不使用final,但同意重复声明...我的错误并已修复
  • 我们都错过了month作为函数参数传递的事实。
  • @JordiCastilla 有点从家庭作业中获得乐趣,不是吗? ;)
【解决方案2】:

并非所有可能通过您的代码的路径都为 days 变量分配一个值。正是默认块没有。

default: month = "invalid";
           break;

如果你改成

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

警告消失。

我的其他问题是:

  • 为什么要定义字符串月份,从而遮蔽参数月份?
  • 扫描仪有什么用?
  • 为什么你在默认块中将invalid分配给month,你永远不会返回它。

【讨论】:

    【解决方案3】:
    1. final String month; 无效,因为 month 作为参数提供给函数。

    2. 您不会在所有控制路径上初始化 daysswitch 中的 default 块不会这样做。这是 Java 的一个很好的特性,因为它可以帮助您实现程序稳定性。没有什么比 编译器 告诉你该做什么更好的了。 不要通过写final int days = 0; 来强制解决问题;而是在 default 块中为其分配一个值。

    【讨论】:

    • 尤其是现在我已经更仔细地阅读了程序
    • 值得一提的是,Java 8 现在允许您简单地执行此操作来获取月份中的日期:YearMonth yearMonthObject = YearMonth.of(1999, 2); int daysInMonth = yearMonthObject.lengthOfMonth();
    • 确实如此。我假设(也许是疯狂地)这是一个学校练习。
    • 这似乎是准确的,但上帝禁止专业程序员偶然发现此页面并将那个巨大的 switch 语句复制到他的程序中。
    【解决方案4】:

    days = 0; 添加到您的默认情况下,如下所示:

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

    在尝试返回之前,您必须在代码路径中的某处给 days 一个值。您还应该将final int days; 替换为int days;。 此外,您不能拥有final String month,因为month 作为参数传递给函数.. 只需删除month 的重新声明即可。

    【讨论】:

    • 它会修复它,但解释一下为什么会很好。编辑:我收回,这只会解决两个问题之一。
    • duh.. 我也需要早上的咖啡
    • 好吧好吧,反对票很容易......野蛮人大声笑
    猜你喜欢
    • 1970-01-01
    • 2012-03-25
    • 2015-07-04
    • 1970-01-01
    相关资源
    最近更新 更多