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

相关推荐
豆沙沙包?4 小时前
JVM-默背版
jvm
Dovis(誓平步青云)8 小时前
《探索C++11:现代语法的内存管理优化“性能指针”(下篇)》
开发语言·jvm·c++
星梦清河9 小时前
宋红康 JVM 笔记 Day14|垃圾回收概述
jvm·笔记
小鸡脚来咯9 小时前
一个Java的main方法在JVM中的执行流程
java·开发语言·jvm
江团1io09 小时前
深入解析三色标记算法
java·开发语言·jvm
一枝花算不算浪漫9 小时前
线上频繁FullGC?慌得一比!竟是Log4j2的这个“特性”坑了我
jvm·后端
王伯安呢11 小时前
Java开发环境配置入门指南
java·开发语言·jvm·eclipse·环境搭建·新手
叙白冲冲20 小时前
JVM:程序计数器
jvm
DKPT20 小时前
JVM中如何调优新生代和老生代?
java·jvm·笔记·学习·spring