2013-03-13 74 views
2

下面的代码给了我一个错误,指向语句“return mon;”中的'm'。它说明“变量mon可能没有被初始化”,当它在这个方法的开始非常清楚地初始化时。它必须是超级简单的东西,我只是不明白!谢谢。为什么java说我没有初始化变量?

public String monthName(int month) 
{ 
    String mon; 
    switch (month) 
    { 
     case 1: 
      mon = "January"; 
      break; 
     case 2: 
      mon = "February"; 
      break; 
     case 3: 
      mon = "March"; 
      break; 
     case 4: 
      mon = "April"; 
      break; 
     case 5: 
      mon = "May"; 
      break; 
     case 6: 
      mon = "June"; 
      break; 
     case 7: 
      mon = "July"; 
      break; 
     case 8: 
      mon = "August"; 
      break; 
     case 9: 
      mon = "September"; 
      break; 
     case 10: 
      mon = "October"; 
      break; 
     case 11: 
      mon = "November"; 
      break; 
     case 12: 
      mon = "December"; 
      break; 
    } 
    return mon; 
} 
+1

你需要一个'switch'的'default'部分(或者明确地初始化它)。 – Lion 2013-03-13 19:05:12

+1

你总是可以返回“一月”,“二月”等,并有一个默认情况下处理它。不需要像这样的临时变量。 – 2013-03-13 19:06:41

+0

“当它在这个方法的开始时被非常明确地初始化”......呃关心告诉我们在哪里? – JamesB 2013-03-13 19:09:28

回答

12

谁是说month总是1到12之间的整数?编译器当然不能保证它。

要么将​​mon初始化为空,要么在switchdefault案例中设置行为。 (另外,你可以只返回月份名称,而不是直接在一个临时变量设置它们)。

或者,一个简单的解决方案可能是

String[] monthNames = {"January", "February", ..., "December"}; 
return monthNames[month - 1]; 
+0

默认!是的,我使用了temp变量,因为我之前在语句块中使用return语句时遇到了麻烦(现在我认为这是因为一个不同的原因),只是想确保它不是不知何故问题。感谢您花时间帮助 – Matt 2013-03-13 19:13:24

+0

downvoter是否在意解释? – 2013-03-14 16:46:18

0

你应该有一个默认情况下为mon变量赋值switch (month)。你也应该给它分配空值。

0

如果月份编号不正确,则返回null只有在调用者期望发生这种情况并准备检查为null时才有用。

如果调用例程不打算检查空返回,那么应该在默认情况下抛出一个RuntimeException。这比允许代码在一段时间之后失败并且由于错误的月份名称导致空指针异常好得多!

例如..

default: 
    throw new RuntimeException("Invalid month number "+ month); 

这也将停止编译器抱怨,因为没有办法去与周一return语句不会被初始化。