当前位置: 首页 > news >正文

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

文章目录

  • 前言
  • 一、finally 中 return
    • 1、代码案例
    • 2、字节码
  • 二、finally 中修改值
    • 1、代码案例
    • 2、字节码
  • 三、总结

前言

		try {}catch (Exception e){}finally {}

如上代码,如果发生异常,我们在可以通过catch块捕获
捕获后,是打印报错信息还是怎么处理,自行决定
如果捕获后,不打印异常信息,则程序正常运行,就像没有异常一样。

		try {}finally {}

如果,我们去掉catch块,那么,发生异常,是会打印异常信息的。
但是, 如果finally中有return,则不会抛出异常。

一、finally 中 return

1、代码案例

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、字节码

  public static int getdiv(int, int);descriptor: (II)Iflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=5, args_size=20: iconst_01: istore_22: iload_13: iload_04: idiv5: istore_26: iload_27: istore_38: iconst_09: ireturn10: astore        412: iconst_013: ireturnException table:from    to  target type2     8    10   any10    12    10   any

我们会看到有两个ireturn,且第8行和第12行时一样的。
说明,jvm层面,会将finally中的代码拼接到try和catch块后面。
这就是为什么输出是0。

二、finally 中修改值

1、代码案例

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、字节码

public static int getdiv(int, int);descriptor: (II)Iflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=5, args_size=20: iconst_01: istore_22: iload_13: iload_04: idiv5: istore_26: iload_27: istore_38: iconst_39: istore_210: iload_311: ireturn12: astore        414: iconst_315: istore_216: aload         418: athrowException table:from    to  target type2     8    12   any12    14    12   any

会发现,在第一个ireturn前,重新iload_3,这就是为什么finally中修改无效的原因。
同时,会看到,18行的athrow,这就说明,发生异常的话,会抛出异常信息。

三、总结

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


http://www.mrgr.cn/news/62709.html

相关文章:

  • CSS动画和JavaScript动画帧
  • Pytorch学习--DataLoader的使用
  • 基于SSM+微信小程序的汽车维修管理系统(汽车5)
  • 重建大师空三后相机处于连接点下方怎么解决?
  • 深入了解 美国高防 CN2 :如何提升全球化业务的网络安全与性能
  • C语言常用的函数
  • CSS网页布局综合练习(涵盖大多CSS知识点)
  • 台州ctf市赛reverse(easy_choice)超详细复现
  • 什么是决策树桩
  • 因特网的概述和三种交换方式
  • C++笔记---可变参数模板
  • XHCI 1.2b 规范摘要(八)
  • 从零实现数据结构:二叉搜索树
  • 【HTML5标准】深度解析HTML5:前端开发的基石
  • 【深度学习】VITS语音合成原理解析
  • 向量库Milvus异常挂了,重新启动
  • 有没有优质的公司可以提供高质量大模型数据?
  • Vue.js(2) 基础:指令与功能概览
  • C++对象模型:Function 语意学
  • 九泰智库 | 医械周刊- Vol.65 | 广州发布首批创新药械产品目录
  • 【产品经理】工业互联网企业上市之路
  • 【2024.10.31练习】123
  • 二分查找题目:搜索插入位置
  • 沈阳工业大学《2021年+2020年827自动控制原理真题》 (完整版)
  • Java - 手写识别; 如何用spring ai和大模型做手写识别教程
  • 监控pod日志