Java 正在编译具有返回类型且没有返回语句的函数。为什么?
为什么上面的函数编译时没有返回语句 为什么上面的函数编译时没有返回语句 因为方法的结尾是不可访问的-它将始终抛出Java 正在编译具有返回类型且没有返回语句的函数。为什么?,java,Java,为什么上面的函数编译时没有返回语句 为什么上面的函数编译时没有返回语句 因为方法的结尾是不可访问的-它将始终抛出NullPointerException 您应该将该规则视为“如果该方法具有非void返回类型,则每个正常返回(不引发异常)的代码路径都必须返回一个值”。在本例中,没有这样的代码路径 具体规定如下: 如果一个方法被声明为具有返回类型(§8.4.5),那么如果该方法的主体可以正常完成(§14.1),则会发生编译时错误 代码路径要么需要返回值,要么引发异常。这里只有一个代码路径,它需要抛出
NullPointerException
您应该将该规则视为“如果该方法具有非void返回类型,则每个正常返回(不引发异常)的代码路径都必须返回一个值”。在本例中,没有这样的代码路径
具体规定如下:
如果一个方法被声明为具有返回类型(§8.4.5),那么如果该方法的主体可以正常完成(§14.1),则会发生编译时错误
代码路径要么需要返回值,要么引发异常。这里只有一个代码路径,它需要抛出
NullPointerException()
<代码>最后只是在抛出异常之前运行代码。考虑一个不是这种行为的世界
public String fun() {
try {
System.out.println("Hello World");
throw new NullPointerException();
} finally {
System.out.println("Finally");
}
}
我得把代码改成这样
public static String foo()
{
if (isValid())
{
return "valid";
}
throw new InvalidException();
// Compiler complains "you haven't returned something"
// even though its not possible to get here
}
编译器足够聪明,知道不存在需要返回的可到达路径。编译器足够聪明,知道不存在需要返回的可到达路径。感谢Michael,简短而简单的回答Hi Jon,如果我用“System.exit(0)”替换“throw new NullPointerException()”,那么它就不会编译,即使System.exit(0)终止程序。为什么?@syedsaud:因为编译器不知道
System.exit(0)
无法正常完成(即没有异常或终止VM)
//...
return "this will never happen";
}