这是“Absolute Java”一书中的一种方法。我不明白为什么最后一个else语句需要返回值为0.作者的评论是“需要保持编译器满意”。有没有理由返回值是0,还是可以是任何整数?
public int getMonth( )
{
if (month.equals("January"))
return 1;
else if (month.equals("February"))
return 2;
else if (month.equalsIgnoreCase("March"))
return 3;
else if (month.equalsIgnoreCase("April"))
return 4;
else if (month.equalsIgnoreCase("May"))
return 5;
else if (month.equals("June"))
return 6;
else if (month.equalsIgnoreCase("July"))
return 7;
else if (month.equalsIgnoreCase("August"))
return 8;
else if (month.equalsIgnoreCase("September"))
return 9;
else if (month.equalsIgnoreCase("October"))
return 10;
else if (month.equals("November"))
return 11;
else if (month.equals("December"))
return 12;
else
{
System.out.println("Fatal Error");
System.exit(0);
return 0; //Needed to keep the compiler happy
}
}
答案 0 :(得分:8)
我认为这对程序员来说是糟糕的设计,但它很简单并且我认为完成了工作。也许这本书提供了更多关于这个例子的背景?也许他们用这个来说明语言而不是实际解决问题?因为这是控制应用程序中逻辑流的一种不好的方法。
在运行时,应用程序将在此处结束:
System.exit(0);
但编译器不知道这一点。编译器看到此函数返回int
并要求所有代码路径返回一个值。即使其中一个代码路径在运行时也会以另一种方式退出该函数。因此,最后一个代码路径需要返回一个值:
return 0;
当然可以是任何整数。开发人员选择0
因为它很容易,但它基本上是任意的。在运行时,将无法到达该行。
答案 1 :(得分:3)
如果方法返回值,编译器将测试每个可能的执行路径以查看是否返回值。如果不是这种情况,则会引发编译时错误。
它将不查看被调用的方法,以查看它是否退出应用程序或其他内容。从编译器的角度来看,System.exit()
只是一个方法调用,就像任何其他方法一样。如果没有return 0;
语句,该方法将不会返回该执行路径的值,这是非法的。即使它在实践中永远不会被执行。
答案 2 :(得分:0)
更好
System.exit(0);
throw new AssertionError("won't reach here");