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

相关推荐
Derek_Smart18 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
大道至简Edward1 天前
深入 JVM 核心:一文读懂 Class 文件结构(附 Hex 实战解析)
jvm
weisian1515 天前
JVM--20-面试题6:如何判断对象可以被垃圾回收?
jvm·可达性算法
蚊子码农5 天前
每日一题--JVM线程分析与死锁排查
jvm
xuxie995 天前
NEXT 1 进程2
java·开发语言·jvm
weisian1515 天前
JVM--19-面试题5:说说JVM的类加载机制和双亲委派模型
jvm·双亲委派模型·jvm类加载机制
亓才孓5 天前
【反射机制】
java·javascript·jvm
Volunteer Technology5 天前
JVM之性能优化
jvm·python·性能优化
Andy Dennis5 天前
Java语法注意事项
java·开发语言·jvm
坚持的小马5 天前
JVM相关笔记-jps
jvm·笔记