`

在finally赋值无效与虚拟机栈

阅读更多

下面的代码:
public class FinallyTest {

private static int test() {
int i=1;

try {
i=2;
return i;
} catch (Exception e) {
i = 3;
return i;
} finally {
i = 4;
}
}

public static void main(String[] args){
FinallyTest finallyTest = new FinallyTest ();
System.out.println("i=" + finallyTest.test());
}
}

打印结果是i=2,而不是等于4,为什么呢?

 

因为i是值变量 ,你在try里面写了return i; 这时虚拟机栈已经把 i 这时的值copy到栈顶,然后才再去处理finnaly,之后你对 i 进行任何改变不会影响这时候栈顶的这个返回值,只会影响 i 的值。所以尽管此时i的值变了,但那是 i 的事情,不是Return的事情。

分享到:
评论

相关推荐

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

     本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行引擎等;第5-20章深入描述了java技术的内部细节,包括垃圾收集、java安全模型、java的连接模型和动态扩展机制、class文件、运算及...

    深入JAVA虚拟机第二版.pdf 目录

    译者序 前言 第1章 Java体系结构介绍 第2章 平台无关 第3章 安全 第4章 网络移动性 第5章 Java虚拟机 第6章 Java class文件 第7章 类型的生命周期 第8章 连接模型 第9章 垃圾收集 ...第18章 finally子句

    深入Java虚拟机

    3.11.6 doPrivileged()的一个无效使用 3.12 Java安全模型的不足和今后的发展 方向 3.13 和体系结构无关的安全性 3.14 资源页 第4章 网络移动性 4.1 为什么需要网络移动性 4.2 一种新的软件模式 4.3 ...

    深入Java虚拟机(原书第2版)及书中源代码

    第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16章 控制流 第17章 异常 第18章 finally子句 第19章 方法的调用与返回 第20章 指令invokespecial ...

    try 与 catch finally关键字

    Java的 try 与 catch finally关键字的使用

    深入java虚拟机第二版

    深入java虚拟机第二版 第1章 Java体系结构介绍 1.1 为什么使用Java 1.2 网络带来的挑战和机遇 1.3 体系结构 1.3.1 Java虚拟机 1.3.2 类装载器的体系结构 1.3.3 Java class文件 1.3.4 Java API 1.3.5 ...

    深入java虚拟机中文第2版

    本书共分20章,第1-4章解释了Java虚拟机的体系结构,包括Java栈、堆、方法区、执行引擎等;第5-20章深入描述了Java技术的内部细节,包括垃圾收集、Java安全模型、Java的连接模型和动态扩展机制、class文件、运算及...

    java 中finally语句块与return的执行关系

    finally语句块与return的执行关系

    深入java虚拟机

    第5章 Java虚拟机 第6章 Java class文件 第7章 类型的生命周期 第8章 连接模型 第9章 垃圾收集 第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16...

    Java语言finally语句详解,finally到底是在return之前还是之后执行.zip

    Java语言finally语句详解,finally到底是在return之前还是之后执行.zip

    深入JAVA虚拟机(第2版)

    3.11.6 doPrivileged()的一个无效使用 3.12 Java安全模型的不足和今后的发展方向 3.13 和体系结构无关的安全性 3.14 资源页 第4章 网络移动性 4.1 为什么需要网络移动性 4.2 一种新的软件模式 4.3 ...

    java虚拟机工作原理

    5 Java虚拟机 6 字节码文件 7 类型的声明周期 8 连接模型 9 垃圾收集 10 栈和局部变量操作Stack and Local Variable Operations 类型转换Type Conversion 12 整数运算Integer Arithmetic 13 逻辑运算Logic 14 浮点...

    try-catch-finally捕获异常

    try-catch-finally捕获异常try-catch-finally捕获异常

    Java虚拟机规范(Java SE 7)

    2.5.2 Java虚拟机栈 ............................................ 28 2.5.3 Java堆 ................................................. 29 2.5.4 方法区 ................................................... 29...

    final, finally, finalize的区别

    final, finally, finalize的区别

    17.javatry…catch…finally语句.zip

    17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句...

    C++ 中try finally关键字详解

    try-finally语句是Microsoft对C和C++语言的扩展,它能使32位的目标程序在异常出现时,...try-finally语句的语法与try-except很类似,稍有不同的是,__finally后面没有一个表达式,这是因为try- finally语句的作用不是用

    Java中finally块执行与return关系深度剖析

    Java finally语句到底是在return之前还是之后执行?Java finally执行深度剖析,具体看这篇博文:http://blog.csdn.net/lanxuezaipiao/article/details/16922895,这是里面相关的源码,欢迎大家下载使用。

    Java虚拟机规范(Java SE 7).pdf

    2.5.2 Java虚拟机栈 ............................................ 28 2.5.3 Java堆 ................................................. 29 2.5.4 方法区 ................................................... 29...

Global site tag (gtag.js) - Google Analytics