java - 异常情况下返回返回类型的规则

标签 java exception try-catch

当我有如下代码时,编译器提示“test() 方法必须返回 int 类型的结果”

class ExecptionExample {
    public static void main(String[] args) {
        System.out.println("Result :"+test());
    }
    private static int test(){
        try{
            System.out.println("In try");
            throw new StackOverflowError("SOError");
        } catch(Exception e){
            System.out.println("In catch");
            //throw new ArrayIndexOutOfBoundsException();
        } finally{
            System.out.println("In finally");
            //throw new RuntimeException();
        }
        System.out.println("Outside try-catch");
        //return 0;
    }
}

如果我取消注释最后一行“return 0”,那么它会编译并运行,但控制永远不会到达“return 0”并且永远不会打印“Outside try-catch”

考虑下面的代码,

class ExecptionExample {
    public static void main(String[] args) {
        System.out.println("Result :"+test());
    }
    private static int test(){
        try{
            System.out.println("In try");
            throw new StackOverflowError("SOError");
        } catch(Exception e){
            System.out.println("In catch");
            //throw new ArrayIndexOutOfBoundsException();
        } finally{
            System.out.println("In finally");
            throw new RuntimeException();
        }
        //System.out.println("Outside try-catch");
        //return 0;
    }
}

在上面的代码中,编译器不会提示“需要返回 int 值”。

那么事情是如何运作的呢?编译器检查是否需要返回的规则是什么?

我在想,finally block 总是会被执行(留下几个条件),并且 RuntimeException 会在finally中抛出,所以编译器不需要返回 int 值?请确认我的理解。

我知道 StackOverflowError 没有被 Exception 捕获。

我只想确认一件事,在finally block 中抛出未经检查的异常,这是编译器不检查返回的原因吗?因为从没有finally block 的try block 中抛出未经检查的异常需要返回,而使用finally block 则不需要返回。

最佳答案

这是因为最后你抛出了一个RuntimeException,它总是在从函数返回任何内容之前被抛出。

现在如果你把 return 语句放在 try block 中。异常仍然会被抛出,因为finally block 是在返回数据之前执行的(但在执行return语句之后)。但编译器不会给你任何错误。

但是如果你在 try-catch block 之后放置 return 语句,编译器就会报错。这是因为 try-catch block 本身会抛出异常,编译器将永远无法到达之后编写的代码。

关于java - 异常情况下返回返回类型的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37248065/

相关文章:

java - firebase.database.DatabaseException : Expected a Map while deserializing, 但得到了一个类 java.util.ArrayList

java - 单击 Javafx 2.2 选项卡中的保存/取消按钮时如何关闭该选项卡?

Java try..catch 和finally

c++ - 捕获异常 : divide by zero

c# - 处理不可预见的异常

java - 从android中的当前 Activity 填充下一个 Activity 的UI

java - 如何根据索引而不是键从 LinkedHashMap 获取值?

javascript - 只用一个try-catch block 就可以捕获多个异常吗?

c# - 如何在多种方法中很好地使用try catch?

java异常仅输入字符串