Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在编译具有返回类型且没有返回语句的函数。为什么?_Java - Fatal编程技术网

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