JVM(HotSpot):finally块的相关问题

文章目录

前言

java 复制代码
		try {
		}
		catch (Exception e){
		}
		finally {
		}

如上代码,如果发生异常,我们在可以通过catch块捕获

捕获后,是打印报错信息还是怎么处理,自行决定

如果捕获后,不打印异常信息,则程序正常运行,就像没有异常一样。

java 复制代码
		try {
		}
		finally {
		}

如果,我们去掉catch块,那么,发生异常,是会打印异常信息的。

但是, 如果finally中有return,则不会抛出异常。

一、finally 中 return

1、代码案例

java 复制代码
public class TestFinally {
	public static void main(String[] args) {
		int getdiv = getdiv(0, 3);
		System.out.println(getdiv);
	}
	public static int getdiv(int a,int b){
		int j = 0;
		try {
			j = b / a;
			return j;
		}
		finally {
			return 0;
		}
	}
}

此时,输出的是0,且没有异常信息。

2、字节码

java 复制代码
  public static int getdiv(int, int);
    descriptor: (II)I
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=5, args_size=2
         0: iconst_0
         1: istore_2
         2: iload_1
         3: iload_0
         4: idiv
         5: istore_2
         6: iload_2
         7: istore_3
         8: iconst_0
         9: ireturn
        10: astore        4
        12: iconst_0
        13: ireturn
      Exception table:
         from    to  target type
             2     8    10   any
            10    12    10   any

我们会看到有两个ireturn,且第8行和第12行时一样的。

说明,jvm层面,会将finally中的代码拼接到try和catch块后面。

这就是为什么输出是0。

二、finally 中修改值

1、代码案例

java 复制代码
public class TestFinally {
	public static void main(String[] args) {
		int getdiv = getdiv(3, 3);
		System.out.println(getdiv);
	}
	public static int getdiv(int a,int b){
		int j = 0;
		try {
			j = b / a;
			return j;
		}
		finally {
			j=3;
//			return j;
		}
	}
}

此时,输出的是1

2、字节码

java 复制代码
public static int getdiv(int, int);
    descriptor: (II)I
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=5, args_size=2
         0: iconst_0
         1: istore_2
         2: iload_1
         3: iload_0
         4: idiv
         5: istore_2
         6: iload_2
         7: istore_3
         8: iconst_3
         9: istore_2
        10: iload_3
        11: ireturn
        12: astore        4
        14: iconst_3
        15: istore_2
        16: aload         4
        18: athrow
      Exception table:
         from    to  target type
             2     8    12   any
            12    14    12   any

会发现,在第一个ireturn前,重新iload_3,这就是为什么finally中修改无效的原因。

同时,会看到,18行的athrow,这就说明,发生异常的话,会抛出异常信息。

三、总结

finally中,一定不要写return。,否则程序报错你都发现不了!

相关推荐
程序猿chen2 小时前
《JVM考古现场(十五):熵火燎原——从量子递归到热寂晶壁的代码涅槃》
java·jvm·git·后端·java-ee·区块链·量子计算
Song3 小时前
JVM 学习计划表(2025 版)
jvm·学习
皮卡兔子屋4 小时前
java虚拟机---JVM
java·jvm
可爱的霸王龙6 小时前
JVM——模型分析、回收机制
java·jvm
喻米粒062210 小时前
RabbitMQ消息相关
java·jvm·spring boot·spring·spring cloud·sentinel·java-rabbitmq
Aphelios38013 小时前
Java全栈面试宝典:线程机制与Spring IOC容器深度解析
java·开发语言·jvm·学习·rbac
bing_1581 天前
JVM 每个区域分别存储什么数据?
java·jvm
zzhz9251 天前
Jmeter(性能指标、指标插件、测试问题、面试题、讲解稿)
java·jvm·jmeter
hweiyu001 天前
从JVM到分布式锁:高并发架构设计的六把密钥
jvm·redis·分布式·mysql·etcd
小杨xyyyyyyy1 天前
JVM - 垃圾回收器常见问题
java·jvm·面试