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.mzph.cn/diannao/58709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新建Flutter工程

1.使用Android studio新建New Flutter project; 2.最新版本兼容性配置 android-settings.gradle文件下: pluginManagement {//.......repositories {//阿里云镜像地址:maven { url https://maven.aliyun.com/repository/public/ }maven { …

设计模式4-工厂模式策略模式

目录 一 工厂模式 1.1 思想 1.2 案例 1.2.1 接口 1.2.2 实现类 1.2.3 工厂类 1.2.4 调用 二 策略模式 2.1 思想 2.2 案例 2.2.1 接口 2.2.2 实现类 2.2.3 策略类 2.2.4 调用 三 工厂模式策略模式 3.1 思想 3.2 案例 3.2.1 接口 3.2.2 实现类 3.2.3 定义F…

常见问题 | 数字签名如何保障电子商务交易安全?

如何解决电商交易中数据泄露、交易欺诈等问题? 数字签名是一种类似于电子“指纹”的安全技术,它在电子商务中扮演着至关重要的角色。随着电子商务的迅猛发展,网上交易的数量不断增加,确保交易的安全性和完整性成为了亟待解决的问题…

不适合的学习方法

文章目录 不适合的学习方法1. 纯粹死记硬背2. 过度依赖单一资料3. 线性学习4. 被动学习5. 一次性学习6. 忽视实践7. 缺乏目标导向8. 过度依赖技术9. 忽视个人学习风格10. 过于频繁的切换 结论 以下是关于不适合的学习方法的更详细描述,包括额外的内容和相关公式&…

HTML5 + CSS3 + JavaScript 编程语言学习教程

HTML5 CSS3 JavaScript 编程语言学习教程 欢迎来到这篇关于 HTML5、CSS3 和 JavaScript 的详细学习教程!无论你是初学者还是有一定基础的开发者,这篇文章都将帮助你深入理解这三种技术的核心概念、语法和应用。 目录 HTML5 1.1 HTML5 简介1.2 HTML5 …

【安全性分析】正式安全分析与非正式安全分析

安全性分析-系列文章目录 第一章 【安全性分析】正式安全分析与非正式安全分析 第二章 【安全性分析】BAN逻辑 (BAN Logic) 文章目录 安全性分析-系列文章目录前言一、正式安全分析1. 理想化模型(如随机预言机模型)2. 标准模型(Standard Model)3. 形式化验证4. 数学证明二…

win11安装安卓apk原生应用,并设置网络代理

一、win11安装安卓apk原生应用,查看https://blog.csdn.net/qq_33704787/article/details/123658419https://blog.csdn.net/qq_33704787/article/details/123658419 主要是安装:Windows Subsystem for Android™ with Amazon Appstore 二、使用ABD工具设…

C语言的知识框架

C语言知识框架概览 C语言是一种广泛使用的计算机编程语言,以其高效、灵活和接近硬件的特性而闻名。学习C语言通常涉及以下几个方面的知识: 1.基础概念:了解C语言的历史、特点、环境搭建和首个程序的编写。 2.数据类型:熟悉基本数…

无人机救援系统基本组成

无人机救援系统基本组成 1. 源由2. 组成2.1 无人机载具2.1.1 多旋翼2.1.2 垂起固定翼2.1.3 智能避障2.1.4 物资投递 2.2 智能吊舱2.2.1 云台2.2.2 高清摄像2.2.3 红外热成像2.2.4 激光测距2.2.5 目标跟踪 2.3 通讯链路2.3.1 超长距离通信2.3.2 长距离通信2.3.3 中等距离通信 2.…

固态硬盘写入文件是以后可能会移动其他文件

固态硬盘写入文件时可能会移动其他文件。当固态硬盘小文件特别多时就会拉低性能。 是的,您的理解是正确的。机械硬盘(HDD)和固态硬盘(SSD)在文件移动和存储管理方面有以下几个主要区别: 1. **存储介质**&am…

Flink CDC系列之:学习理解核心概念——Transform

Flink CDC系列之:学习理解核心概念——Transform Transform参数元数据字段函数比较函数逻辑函数字符串函数时间函数条件函数 示例添加计算列参考元数据列使用通配符投影所有字段添加过滤规则重新分配主键重新分配分区键指定表创建配置分类映射用户定义函数已知限制 …

ubuntu基于docker-compose部署mysql5.7和mysql8.0

docker-compose部署系统简单方便,出现问题也可以快速重来。mysql5.7和mysql8.0是两个比较流行的mysql版本。简单部署记录下来,供大家参考。 1、准备docker-compose环境 安装docker.io和docker-compose sudo apt install docker.iosudo curl -L "h…

conda的对应环境下安装cuda11.0和对应的cudnn

在 Conda 环境中安装 CUDA 11.0 和对应的 cuDNN,可以按照以下步骤进行: 一. 环境配置 1. 创建 Conda 环境 首先,创建一个新的 Conda 环境(可选): conda create -n myenv python3.8 conda activate myen…

每天五分钟深度学习pytorch:基于pytorch搭建普通全连接神经网络

本文重点 本文我们通过pytorch搭建普通的全连接神经网络,这里我们就不介绍什么是全连接神经网络了,如果不知道的可以看我的机器学习专栏,或者深度学习专栏,它们对全连接神经网络都进行了简单的介绍。 代码 import torch from torch import nn class ThreeNet(nn.Module)…

python opencv1

一、基本参数 OpenCV的全称是Open Source Computer Vision Library,是一个开放源代码的计算机视觉库。 安装:pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple imprort cv2 1、显示窗口 cv2.namedWindow(winname, flagsNone) :w…

unity学习-异步场景加载

我们的项目在加载场景的时候如果需要加载的场景过大的话就会卡很久, 我们可以摒弃掉一定要到最后才加载下一个场景的观念,可以将加载场景的任务设置在任何地方,放在携程函数下,加载场景的任务和游戏运行任务同时进行 这叫做异步…

故障诊断 | MTF-TLSSA-DarkNet-GRU-MSA迁移学习故障识别程序(t分布+莱维飞行改进麻雀优化)

故障诊断 | 故障诊断实例代码 目录 故障诊断 | 故障诊断实例代码效果一览基本介绍程序设计参考资料 效果一览 基本介绍 利用了迁移学习和多项技术改进,包括麻雀搜索法、DarkNet19、GRU、多头注意力机制等,以提高故障识别的准确性和效率 模型框架&#x…

【一起python】使用python实现学生管理系统

文章目录 📝前言🌠主函数man🌉菜单menu🌉添加学生信息🌉展示目前学生信息🌉查找学生🌉删除同学信息🌉退出程序 🌠python完整代码🚩总结 📝前言 &…

前缀和_560. 和为 K 的子数组

560. 和为 K 的子数组 #include <unordered_map> class Solution { public:int subarraySum(vector<int>& nums, int k) {int nnums.size();unordered_map<int,int> hs;int sum0,re0;hs[0]1;for(int i0;i<n;i){sumnums[i];if(hs.count(sum-k)) rehs[s…

(转载)Tools for Learning LLVM TableGen

前提 最近在学习有关llvm的东西&#xff0c;其中TableGen占了一部分&#xff0c;所以想特意学习下TableGen相关的语法。这里找到了LLVM官网的一篇介绍TableGen的博客&#xff0c;学习并使用机器翻译为中文。在文章的最后也添加了一些学习TableGen的资源。 原文地址&#xff1…