gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:55:40 25 4
gpt4 key购买 nike

当我有如下代码时,编译器提示“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com