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。,否则程序报错你都发现不了!

相关推荐
源分享16 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
JAVA96516 天前
JAVA面试-JVM篇 03-JVM运行时数据区哪些是线程私有的哪些是共享的
java·jvm·面试
伶俜6617 天前
鸿蒙原生应用实战(十八)ArkUI 记账本:SQLite 账单 + 图表统计 + 分类管理
jvm·sqlite·harmonyos
IronMurphy17 天前
多线程问!
java·jvm·spring
unique17 天前
AI Coding 采集方案探索
jvm·人工智能·oracle
cfm_291418 天前
JVM GC日志解析
jvm
不良使18 天前
鸿蒙PC迁移:使用Electron`logseq-master-ohos` 鸿蒙适配全记录
jvm·electron·harmonyos
cfm_291418 天前
JVM深度详解:Class常量池、运行时常量池、字符串常量池、包装类对象池
java·jvm
JAVA96518 天前
JAVA面试-JVM篇 02-G1垃圾收集器的工作原理是什么与CMS的区别
java·jvm·面试