关于try、catch、finally语句块中含有return语句的几点说明

本文详细解析了Java中try、catch、finally语句块中使用return语句的多种情况及执行流程,包括不同return语句组合下的实际效果,有助于深入理解Java异常处理机制。
Author:wangxu;版权所有:wangxu
关于try、catch、finally语句块中含有return语句的几点说明:
1、第一种情况:try块有return语句,catch块没有return,函数末尾也没有return:
看代码:
import java.util.*;
public class Demo{
public static void main(String args[]){
int num = 10;
test(num);
}
public static int test(int b){
try{
b += 10;
return b;
}catch(Exception e){

}finally{

}
}
}
编译结果:
H:\java Demo>javac Demo.java
Demo.java:18: 缺少返回语句
        }
        ^
1 错误
有人可能会说,我在try块中不是有return语句吗?为什么会提示缺少return语句呢?这是因为编译器认为try块中是又可能产生异常操作


的,也就是说在return语句之前如果出现异常的话,那么return语句根本没有机会得到执行,所以编译器会认为缺少return语句。
解决办法:a、在catch块中加入return语句,因为一旦出现异常,catch中的语句可以保证函数会有一个返回值
b、在finally块中加入return语句,同样只要系统不退出,finally语句块会始终得到执行的
代码:
import java.util.*;
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;
return b;
}catch(Exception e){

}finally{
return 0;
}
}
}
c、在函数末尾加入return语句
代码:
import java.util.*;
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;
return b;
}catch(Exception e){

}finally{

}
return 0;
}
}
2、第二种情况,看代码:
import java.util.*;
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;

}
return 0;
}
}


结果:H:\java Demo>javac Demo.java
Demo.java:8: "try" 不带有 "catch" 或 "finally"
                try{
                ^
1 错误
说明:也就是说,如果有try语句的话,可以有catch语句,没有finally语句,但是如果没有catch语句的话,那么一定要有finally语句


。并且如果出现catch语句的话,catch语句可以出现多次,而finally语句只能出现一次。
代码:
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;

}catch(RuntimeException e){
}catch(Exception e2){
}finally{
}
return 0;
}
}
3、第三种情况:
a、try块中有return语句,那么是先执行return语句,还是先执行finally语句。大家通常会有一个错误的认识,可能有的老师都会讲错


,认为是先执行finally语句,再执行return语句,但是这是错误的,事实上是先执行return语句,再执行finally语句,然后将结果返回,也可以说return语句执行了两次,一次在finally之前,一次在finally之后,但是返回的确是第一次执行的值
,如果有不信的,请继续看代码,此段代码可以证明我的观点:
代码:
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;
return b;
}catch(RuntimeException e){
}catch(Exception e2){
}finally{
b += 10;
}
return 0;
}
}
结果:
H:\java Demo>javac Demo.java


H:\java Demo>java Demo
20
说明:此处需要引入缓冲的概念,有对缓冲不太了解的也没关系,程序运行结果是20足以证明我的观点,程序执行流程是进入try语句块
执行return语句,但是程序有finally语句块,所有先将return返回的值缓冲起来,然后程序跳转到finally语句块执行,我在finally语


句块中修改了变量b的值,但是程序返回的依然是20,并不是30,说明finally语句块执行完毕后,程序直接将之前缓冲的值返回了。所以


这就是真实的执行流程。
b、try块中有return,finally语句块中也有return,此时的情况是什么样呢?
看代码:
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
b += 10;
return b;
}catch(RuntimeException e){
}catch(Exception e2){
}finally{
b += 10;
return b;
}
}
}
结果是:
H:\java Demo>java Demo
30
说明:为什么此时结果是30了呢,大家都知道return语句的作用是结束程序体,所以此段代码依然是先执行try块中的return语句,并将20


缓存起来,接着跳转到finally语句块执行,但是由于finally语句块中有return语句,所以程序在此处结束,并不返回到try块中返回结


果,而是直接将finally块中新修改的值即30,返回。
c、try块中有return语句,catch块中也有return语句,这时候是最简单的一种情况:
看代码:
public class Demo{
public static void main(String args[]){
int num = 10;
System.out.println(test(num));
}
public static int test(int b){
try{
int a = b/0;
return b;
}catch(Exception e2){
b += 10;
return b;
}
}
}
结果:
H:\java Demo>java Demo
20
说明:我在try块中触发了一个异常,程序跳入catch语句块,try语句块中剩下的所以语句均没有执行的机会,接着,我在catch块中修改


了b的值,此时b应该是20,然后将b值返回,与运行结果相符。
以上几点基本涵盖了大部分的情况,掌握这些知识点基本可以应付多数此类问题,如果有什么错误,遗漏欢迎指正。











### Javatry-catch-finally的执行顺序与异常处理机制 在Java中,`try-catch-finally` 是一种用于捕获和处理程序运行时异常的结构。其执行顺序和异常处理机制如下: #### 1. `try` 块 `try` 块包含可能抛出异常的代码。如果 `try` 块中的代码没有抛出异常,则会正常执行完该块内的所有语句[^1]。 #### 2. 异常抛出与 `catch` 块 如果 `try` 块中的代码抛出了异常,程序会立即停止执行 `try` 块剩余的部分,并跳转到与异常类型匹配的第一个 `catch` 块。如果没有匹配的 `catch` 块,则异常会被传递给调用栈中的上一层方法处理[^2]。 #### 3. `finally` 块 无论是否发生异常,`finally` 块中的代码都会被执行。即使在 `try` 或 `catch` 块中有 `return` 语句,`finally` 块仍然会在方法返回之前执行[^3]。 #### 执行顺序示例 以下代码展示了 `try-catch-finally` 的执行顺序: ```java public class TestTryCatchFinally { public static void main(String[] args) { System.out.println(test("12")); } public static int test(String str) { try { Integer.parseInt(str); // 可能抛出 NumberFormatException return 1; // 如果没有异常,返回1 } catch (NumberFormatException e) { return -1; // 捕获异常并返回-1 } finally { System.out.println("test结束"); // 无论是否有异常,都会执行 } } } ``` 在上述代码中,`finally` 块中的语句总是在 `try` 或 `catch` 块之后执行,即使 `try` 或 `catch` 块中有 `return` 语句[^3]。 #### 异常处理机制 Java中的异常处理基于“抓抛模型”。当程序运行过程中遇到异常时,会生成一个异常对象并将其提交给Java运行时系统。如果当前方法无法处理该异常,则会将异常传递给调用者方法,这一过程称为“抛出”异常。调用者方法可以选择捕获并处理异常,或者继续将异常向上层方法传递,直到异常被处理或导致程序终止。 #### 多重 `catch` 块 可以为同一种类型的异常提供多个 `catch` 块以实现不同的异常分类处理。例如: ```java public class MultiCatchExample { public static void main(String[] args) { try { int[] arr = {1, 2, 3}; System.out.println(arr[10]); // ArrayIndexOutOfBoundsException } catch (ArrayIndexOutOfBoundsException e) { System.out.println("数组越界异常:" + e.getMessage()); } catch (Exception e) { System.out.println("其他异常:" + e.getMessage()); } finally { System.out.println("finally块执行"); } } } ``` 在此示例中,程序首先尝试访问数组的第11个元素(索引为10),这将抛出 `ArrayIndexOutOfBoundsException` 异常。由于第一个 `catch` 块能够处理该异常,因此不会进入第二个 `catch` 块[^4]。 ### 注意事项 - 如果 `try` 块中有 `return` 语句,`finally` 块仍会在方法返回之前执行。 - 如果 `try` 和 `catch` 块中都未处理某些异常,则这些异常会传播到调用栈的上层方法。 - `finally` 块通常用于释放资源(如关闭文件、数据库连接等)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值