`

在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虚拟机

    7. **异常处理与线程**:JVM支持多线程,每个线程有自己的虚拟机栈和程序计数器。异常处理机制通过try-catch-finally语句块来捕获和处理程序中的异常。 8. **编译与即时编译(JIT,Just-In-Time)**:JVM有两种方式...

    Java虚拟机规范中文版

    - **栈**:每个线程都有自己的程序计数器、虚拟机栈和本地方法栈。栈帧在执行方法时创建,存储局部变量、操作数栈和动态链接。 - **方法区**:存储已装载的类信息、常量、静态变量、即时编译器编译后的代码等数据...

    Java虚拟机规范SE8英文

    - **异常体系**:Java虚拟机支持异常处理机制,可以通过try-catch-finally语句来捕获和处理异常。 - **异常传播**:如果方法没有处理异常,则会将异常传递给调用者。 #### 九、指令集概览 - **类型与Java虚拟机**:...

    Java虚拟机规范(Java SE 8版) 带书签

    Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了运行环境,使得代码能在任何支持Java的平台上无缝执行,实现了“一次编写,到处运行”的目标。《Java虚拟机规范(Java SE 8版)》是Oracle公司...

    解密Java虚拟机(带目录)

    其中,堆内存存储对象实例,方法区存储类信息,虚拟机栈处理方法调用,本地方法栈服务本地方法,程序计数器记录下一条要执行的指令。 4. **垃圾收集(Garbage Collection, GC)**:JVM负责自动内存管理,当对象不再...

    Java虚拟机规范(Java_SE_7).pdf

    9. **动态性与适应性**:Java虚拟机允许在运行时加载新的类,实现代码热替换,增强程序的灵活性。Java SE 7引入了 invokedynamic 指令,增强了动态语言的支持。 10. **性能优化**:通过理解和分析JVM的内部工作原理...

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

    在 Java 中,基本类型变量存储在栈中,而引用类型的对象存储在堆中,对象的引用地址存储在栈中。因此,在 finally 中改变基本类型变量的值对返回值没有任何影响,而改变引用类型变量的值则有影响。 通过上面的讨论...

    Java虚拟机规范SE8版

    Java虚拟机规范SE8版是Oracle公司发布的Java平台标准版(Java SE)8的JVM官方指南,它定义了JVM如何执行Java字节码、内存管理、类加载机制以及各种与平台无关的特性。这个规范对于开发者、性能优化专家和Java平台的...

    java的虚拟机的英文规范

    3. 栈内存:每个线程有自己的虚拟机栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 4. 程序计数器:记录当前线程正在执行的字节码的地址。 5. 本地方法栈:为执行Java Native Interface(JNI)调用...

    Java虚拟机规范SE8(中文)

    5. **内存区域的异常**:如`StackOverflowError`发生在栈溢出时,`OutOfMemoryError`通常与堆或方法区空间不足有关。理解这些异常有助于优化程序性能和内存使用。 6. **多线程**:JVM支持多线程,每个线程都有自己...

    Java虚拟机学习资料

    "深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)-周志明"这本书提供了对JVM的深入解析,包括内存管理、垃圾收集、性能优化等多个方面,是学习和提升JVM技能的重要资源。无论你是Java新手还是经验丰富的开发者...

    Java虚拟机规范

    8. 异常处理:JVM支持异常处理框架,通过try-catch-finally语句块实现,每个catch块都有一个异常表,指示如何在抛出异常时跳转到相应的处理代码。 9. 多线程:JVM支持多线程编程,每个线程都有自己的程序计数器、...

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

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

    java虚拟机规范 Java SE7

    《Java虚拟机规范 Java SE7》是Java开发者的重要参考资料,它详细定义了Java程序如何在各种平台上运行,以及Java虚拟机(JVM)的工作机制。Java SE7版本引入了许多新特性,增强了平台的效率和可靠性。以下是这个规范...

    深入JAVA虚拟机第二版 Bill Venners著 曹晓钢 蒋靖译

    3. **内存管理**:JVM内存分为堆内存、方法区、虚拟机栈、本地方法栈和程序计数器等几部分。理解内存分配、垃圾收集(GC)和内存泄漏对于优化程序性能至关重要。 4. **垃圾回收(GC)**:GC是Java的一大特性,它...

    java虚拟机规范 java SE 7中文版

    8. **反射与动态代理**:Java反射允许程序在运行时访问和操作类的信息,包括类名、属性、方法等。动态代理则可以在运行时创建具有指定接口的代理对象,用于实现AOP(面向切面编程)。 9. **模块系统**:Java SE 7...

    深入JAVA 虚拟机代码

    - **本地方法栈**:与虚拟机栈类似,但服务于Java Native Interface(JNI)调用的本地方法。 - **程序计数器**:记录当前线程执行的字节码指令地址。 4. **字节码执行** JVM通过解释器逐条执行字节码,或者通过...

    java虚拟机规范.rar

    每个线程有自己的程序计数器、本地方法栈和虚拟机栈,而堆和方法区是所有线程共享的。 6. **异常处理**:JVM提供了一种统一的异常处理机制,通过try-catch-finally语句块实现。异常处理表是JVM在类加载阶段解析的一...

Global site tag (gtag.js) - Google Analytics