首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

字节分析finally对return返回值影响

下面我们通过分析下当前方法字节,来说明为什么。 查看字节命令:javap -verbose class文件 知识点简单概要: 看如下字节需要简单了解下栈结构。...下面字节主要是对操作栈和局变量表操作。...因为这个是实例方法,不是静态方法,他默认会传过来当前实例引用,也就是this变量) 字节执行路径 通过字节我们发现在编译成class文件时候,已经把三种执行路径都写到class文件中了。...第[18-19]行,finally代码:i=3 第[20-22]行,执行catch中return语句,把临时存储 i 值返回。...,并抛出(无返回值) 结论 通过字节,我们发现,在try语句return中,return 返回变量并不是直接返回 i 值,而是在执行finally之前把i值存储在临时区域,当执行return时直接返回临时区域中

94260

通过字节理解try-catch-finally

通过字节理解try-catch-finally 场景 对于以下代码: public int test() { int x; try { x = 1; return x; } catch (Exception...其中,字节行号0到7就是没有异常时字节流,返回值为1。 需要注意是,上述Code中,第4、5行即为finally:x=3。...编译器自动在每段可能分支路径之后都将finally语句内容冗余生成一遍来实现finally语义。同样还有第13、14行,第19、20行。...从异常表中还可以发现另一问题,在catch中如果出现了异常(第8到12行),那么也会跳到第17行进行处理,也就是执行finally代码。...注:对于x=1;这条语句,虽然在字节中体现为iconst和istore两条字节,但是他们依然是原子操作,原子操作不是说只有一条指令,而是不可中断一个或一系列操作。

31220
您找到你想要的搜索结果了吗?
是的
没有找到

Java中try-finally执行顺序

本文主要介绍关于异常处理时候try-catch-finally执行顺序,一般情况下,finally是会执行,在Java中,try-finally执行顺序通常遵循以下规则: try代码首先被执行...如果try代码执行完毕,控制流将转到finally。无论try代码是否抛出异常,finally代码都将被执行。...finally代码执行完毕后,整个try-finally结束,控制流将继续到下一个语句或代码。...finally,try中return结果会放在类似一个队列中,之后如果finally中有return语句,则会把finallyreturn语句中结果放入队列中,最终是队列中第一个数据,即finally...tryfinally中都有return,所以最终返回结果就是finallyreturn结果。 ​我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

22950

Java finally 代码代码一定会执行吗?

1、前言 对于很多初学者而言,会想当然地认为 “finally 代码一定会被执行”,因此我们可以看下面这个案例: public class Demo { public static void...{ System.out.println("Exiting the program"); } } } 问题是:该段代码 finally 代码一定会被执行吗...2、问题分析 通常实际编码时,捕获异常后会记录日志或者将异常抛出等,此时 finally 代码一般肯定会被执行到。 那么如何才能不执行finally呢?...是否一定不会执行到 finally 代码呢?...因此如果我们可以修改 SecurityManager 如果检查退出时抛出异常,那么在执行System.exit(2) 时就会发生异常,最终依然会执行到 finally代码

43150

深入理解异常处理:try、catch、finally 语句执行顺序

catch: 当异常发生时,会执行这个代码,用于捕获和处理异常。finally: 不管是否发生异常,都会执行这个代码,用于执行清理工作。...以下是一个示例:try: # 可能会引发异常代码except SomeException as e: # 处理异常代码,e 是捕获异常对象4. finally 语句finally 语句用于包裹必须无论异常是否发生都要执行代码...无论 try 代码是否引发异常,finally 代码都会执行。...# 无论是否发生异常,都会执行这里代码在这种情况下,try 代码正常执行,不会引发异常,因此 catch 代码将被跳过,而 finally 代码将始终执行。...最后,finally 代码将始终执行。这种情况下,finally 通常用于清理资源。5.3.

96030

基于字节Java代码审计

基于字节Java代码审计 之前看了基于字节Java代码审计工具实现,最近终于有空可以好好看一下其是如何实现了。本文并不会从代码出发,而是试图从字节角度分析其可行性。...只要编译成为符合字节规范内容,均可以在Java虚拟机中运行。...至此字节执行一个函数过程就结束了,这里就可以进入下一个问题了 使用字节进行审计 首先看这一段代码: public class RceYes{ public void eval(String...实现 上文已经找到了字节代码审计关键,那接下来如何通过代码去实现呢?首先第一个问题,如何将Class文件解析成字节指令形式。...这里就不得不提一下ASM了,作为字节增强技术,它可以动态修改字节或者是遍历类结构,ASM此处就不进行深入展开了,我们单单看一下遍历类结构这一点,它会按照一定顺序逐语句对字节进行解析,当解析到函数时我们就可以自定义一个局部变量表以及操作数栈来进行模拟操作

73220

字节也能做有趣

1.2字节 字节(Byte-code)是一种包含执行程序、由一序列 op 代码/数据对组成二进制文件。字节是程序中间表示形式:介于人类可读源码和机器之间。...它经常被看作是包含一个执行程序二进制文件,更像一个对象模型。字节被这样叫是因为通常每个操作 是一字节长,所以字节程度是根据一字节。...字节也是由,一组操作组成,而操作实际上是对栈操作,可以移走参数和地址空间,也可以放入结果。JAVA通过JIT(即时编译)可以将字节转换为机器字节实现方式是通过编译器和虚拟机器。...编译器将源码编译成字节,特定平台上虚拟机器将字节转译为可以直接执行指令。在java中一般是用Javac编译源文件变成字节,也就是我们class文件。...2.字节执行 2.1JVM桢栈结构: 方法调用在JVM中转换成字节执行,字节指令执行数据结构就是栈帧(stack frame)。也就是在虚拟机栈中栈元素。

50450

字节判断方法参数个数

Jvm 如何确定方法参数个数 找到 Method DescriptionIndex 属性,找到对应描述,例如: public class AddMain { public static...java 代码,add 方法对应代码是 (II)I,最后一个 I 代表返回值,这个代表两个整型参数...., int b,String c,boolean d) { return a + b; } ​ 同样,(IILjava/lang/String;Z)I 代表有4个参数,字符串表示是...(本文完) 作者:付威 博客地址:http://blog.laofu.online 如果觉得对您有帮助,可以下方RSS订阅,谢谢合作 如有任何知识产权、版权问题或理论错误,...本文是付威网络博客原创,自由转载-非商用-非衍生-保持署名,请遵循:创意共享3.0许可证 交流请加群113249828: 点击加群   或发我邮件 laofu_online

78720

Java避坑指南:finally陷阱及正确关闭资源方式小结

---- 正确关闭资源方式 ---- 1、使用finally来关闭资源,保证关闭操作总是会被执行; 2、关闭每个资源之前首先判断资源引用变量不为null,避免NPE发生; 3、为每个资源使用单独...try...catch 关闭,保证关闭此资源发生异常,不会影响后面资源关闭; 4、finally不要使用return语句。...return语句直接导致方法结束,不会再跳回去执行try、catch任何代码; 5、不要出现System.exit(0),会直接停止当前线程,finally不会执行; 6、finally中不要抛出异常...,如果抛出异常,finally异常会覆盖try抛出异常,导致莫名奇怪现象; 参见:Java陷阱之:finally抛出异常或return导致异常丢失 Java陷阱之:finally抛出异常或

30130

字节文件内部结构之谜

Java 诞生之初就曾宣扬过它初衷,「一次编写,多处运行」,而它之所以能够实现跨平台一个核心点就在于,Java 引入「字节」屏蔽了与底层操作系统之间差异。...同一段 Java 程序在编译后生成字节文件是唯一,不会因为平台不同而产生任何变化。而同一段字节跑在不同实现 JVM 上,会产生不同机器指令。...因此,你同一段字节在不同平台下 JVM 上运行,会对应到不同机器指令,以此实现了跨平台运行。...那么,本文就来分析一下这个「字节」文件,解开它神秘面纱。...话可能有点绕,但主要意思就是,JVM 拒绝运行比自己版本低 Class 文件。 常量池 常量池算是类文件中比较繁琐内容了,在解析它之前我们先看一段 Java 代码。

1.4K90

修改混淆过JAVA字节文件

刚开始想直接将需要class文件进行修改,发现这样一个问题,使用工具类将需要位置字节参数修改完之后,将修改后文件压缩回原来JAR,JAR不能用了。...IDEA插件:jclasslib Bytecode viewer jclasslib bytecode viewer 是一个可以可视化已编译Java类文件和所包含字节工具。...另外,它还提供一个库,可以让开发人员读写Java类文件和字节。...修改class文件  使用工具类修改class文件某个参数,或者某个字符串。这里有一点其实在java文件中定义各种参数,编译成字节文件时候,都变成了字符串,只是逻辑位置不同,处于不同域中。...然后就可以在IDEA中找到对应域,如上图中,如果在方法中就点击Methods,从上到下分别是JAVA文件由上到下定义顺序,找到对应方法,就能看到下图中字节详情:  如上图找到我们需要修改字符串

97720

你了解 Python 字节原理吗?

你可能还见过另一种类型文件是 .pyc 结尾,它们就是 Python “字节”文件。这里转载一篇文章,专门讲解 Python 字节相关内容,给大家看看。...大多数 Python 字节指令操作是当前调用栈帧计算栈,虽然,还有一些指令可以做其它事情(比如跳转到指定指令,或者操作栈)。...dis 模块使用 dis 模块包括一些用于处理 Python 字节函数,可以将字节“反汇编”为更便于人阅读形式。查看解释器运行字节还有助于优化代码。...第二列(可选)指示当前执行指令(例如,当字节来自帧对象时)【这个例子没有】 第三列 一个标签,表示从之前指令到此可能 JUMP 【这个例子没有】 第四列 数字是字节中对应于字节索引地址(这些是...其中 SETUP_FINALLY 字节含义是将 try 从 try-except 子句推入堆栈。 这里可以看出将 LOAD_NAME 将 j 压入栈之后就报错了。

2.5K40

【说站】java之JVM字节结构

java之JVM字节结构 1、魔数 所有.class文件前四个字节都是魔数,魔数固定值为0xCAFEBABE。...2、版本号 版本号为魔数后4个字节,前2个字节显示下一个版本号,后2个字节显示主版本号。 主版本号后字节是常量池入口。在常量池中保存两种常量:字面量和符号引用。...这两个字节保存值为常量池中索引值,根据索引值就能在常量池中找到这个类全限定名。 6、父类名称 当前类名后两个字节,描述父类全限定名,同上,保存也是常量池中索引值。...7、接口信息 父类名称后为两字节接口计数器,描述了该类或父类实现接口数量。紧接着n个字节是所有接口名称字符串常量索引值。...8、字段表 字段表用于描述类和接口中声明变量,包含类级别的变量以及实例变量,但是不包含方法内部声明局部变量。 以上就是java之JVM字节结构介绍,希望对大家有所帮助。

25830

使用Android studio查看Kotlin字节教程

Kotlin是一门JVM语言,它被google大力推广,现如今已经是Android官方推荐开发语言了。为了更好学习Kotlin,你必须要从字节角度来看待语法特点,这样可以更好加深自己理解。...这篇文章就是教大家如何通过Android studio来查看Kotlin编译后字节。...1、首先选中你要显示字节文件,之后点击顶部工具栏中 Tools – 选中 Kotlin – 在弹出菜单中点击 Show Kotlin Bytecode。 ?...2、点击之后在Android studio最右侧工具栏上会有一个增加一个 Kotlin Bytecode 按钮,点击之后会显式详细Kotlin文件字节。 ?...3、在新窗口中详细列出了字节信息,但是阅读字节信息需要有相关知识储备,为了方便阅读,这个时候可以点击新窗口中 Decompile 按钮,把字节转换成更易懂语句结构。 ?

2K20
领券