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

相关推荐
学点东西吧.2 小时前
JVM(五、垃圾回收器)
jvm
请你打开电视看看4 小时前
Jvm知识点
jvm
程序猿进阶5 小时前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
阿龟在奔跑17 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list
王佑辉17 小时前
【jvm】方法区常用参数有哪些
jvm
王佑辉17 小时前
【jvm】HotSpot中方法区的演进
jvm
Domain-zhuo17 小时前
什么是JavaScript原型链?
开发语言·前端·javascript·jvm·ecmascript·原型模式
Theodore_10222 天前
7 设计模式原则之合成复用原则
java·开发语言·jvm·设计模式·java-ee·合成复用原则
我是苏苏2 天前
Web开发:ORM框架之使用Freesql的DbFrist封装常见功能
java·前端·jvm
天草二十六_简村人2 天前
Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化
java·jvm·数据库·mongodb·阿里云·微服务·云计算