`
MauerSu
  • 浏览: 509573 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

finally语句的执行时刻

 
阅读更多
源:http://coderbee.net/index.php/java/20110321/456
评:语义上 finally 在return之后执行
以前虽然知道在try finally语句中,即使try块里有return语句,finally语句也会在return语句执行之前执行,却不知道return表达式与finally语句的执行顺序。

public class Test {
    public static int a() {
        int i = 0;

        try {
            i++;
            return ++i;

        } finally {
            i++;
System.out.println("finally:" + i);
        }
    }

    public static void main(String[] args) {
        System.out.println(a());
    }
}
这个语句的输出是 2 而不是 3。
当执行到 return ++i;

jvm是先执行 ++i,把结果 2 存到临时变量,然后在执行finally语句里的 ++i,所以最终的i的值虽然是 3,但方法返回的值却是 2。

其实以前的理解没有错,因为 return ++i; 是一个复合语句了,相当于:

    int j = ++i; 
    return j; 

分享到:
评论

相关推荐

    盛名列车时刻表 v5.1java源代码

    在《盛名列车时刻表 v5.1》中,开发者可能已经对可能出现的网络错误、数据格式错误等情况进行了充分的预判和处理,这涉及到Java的异常处理机制,如try-catch-finally语句块的使用。 最后,项目的版本控制和模块化...

    列车时刻系统

    Java的try-catch-finally语句用于捕获和处理异常,而日志框架如Log4j则有助于追踪和分析运行时问题。 九、测试与部署 系统开发完成后,需进行单元测试、集成测试和压力测试,确保功能正确性和性能。Java的JUnit和...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.47.docx

    try 块包含可能抛出异常的代码,catch 块捕获特定类型的异常并执行相应的处理逻辑,finally 块确保无论是否发生异常,都会执行特定的清理代码,如关闭文件流、释放资源等。 以上就是针对1~3年经验的Java后端开发...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.51.docx

    答案:synchronized 关键字用于控制多线程环境中的并发访问,确保同一时刻只有一个线程可以执行特定代码块或方法,以避免数据不一致和竞态条件。死锁是指两个或多个线程相互等待对方释放资源,导致它们都陷入无限期...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.65.docx

    try 块包含可能抛出异常的代码,catch 块用于捕获并处理特定类型的异常,finally 块包含需要无论是否发生异常都要执行的代码,如资源释放。异常是程序运行时出现的问题,分为检查型异常(必须处理)和非检查型异常...

    ***SSM-ZTE-AndroidUI-SCS-1.0 软件编码规范1

    - **do-while 语句**:与while语句类似,但循环体至少执行一次,条件检查在循环体后进行。 3. **控制结构的使用** - 控制结构应遵循逻辑清晰、易于理解的原则,避免过于复杂的嵌套。每个控制结构内部的代码块应...

    C#异常处理

    本文将深入探讨C#中的异常处理机制,包括异常的基本概念、如何抛出和捕获异常,以及使用try-catch-finally和using语句等结构来编写健壮的代码。 异常是程序执行过程中发生的错误,通常由运行时环境(如.NET ...

    Java面试题.txt

    在`try`块中有`return`语句的情况下,`finally`块将在`return`语句执行前被调用。这意味着即使`try`块中存在`return`,`finally`块中的代码仍然会得到执行,这对于确保资源的正确释放至关重要。 #### 27. &符号的...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.79.docx

    Java异常处理机制通过try-catch-finally语句块来捕获和处理运行时错误。try块中包含可能抛出异常的代码,catch块用来捕获并处理特定类型的异常,finally块无论是否发生异常都会执行,通常用于释放资源。throw关键字...

    高效的java异常处理

    在Java中,异常处理机制是通过try-catch-finally语句块实现的。当一个异常在try块中被抛出时,控制权会立即转移到相应的catch块。catch块是用来处理特定类型的异常,而finally块则包含需要在任何情况下都要执行的...

    ThreadLocked多线程共享资源

    它基于`Monitor`类,确保同一时刻只有一个线程可以执行锁定的代码块: ```csharp object obj = new object(); lock (obj) { // 共享资源的代码 } ``` 这里,`obj`作为锁对象,确保同一时间只有一个线程能执行该...

    JVM规范

    8. **异常处理**:Java异常处理通过try-catch-finally语句实现。JVM会维护一个异常表,记录异常处理的范围和对应的动作。 9. **多线程**:JVM支持多线程并发,线程间通信可以通过共享内存或消息传递实现。...

    C#复习资料

    try块用于包含可能抛出异常的代码,catch块用于捕获并处理异常,finally块确保在任何情况下都会执行的代码,无论是否发生异常。throw语句用于手动抛出一个异常。 3. 数据库访问命名空间: 在C#中,访问Sql Server...

    JAVA程序员面试32问(附有答案)

    - **finally**:异常处理块中的一个关键字,确保在try-catch语句执行完毕后,finally块内的代码总会被执行,即使程序提前退出或抛出异常。 - **finalize**:一个方法,在对象被垃圾回收前由垃圾回收器调用,允许程序...

    Java程序员面试三十二问

    try-catch-finally语句的执行顺序如下: 1. 首先执行try块中的代码。 2. 如果try块中发生异常,则跳转到catch块进行处理。 3. 不论是否发生异常,finally块中的代码都会被执行。 4. 如果try或catch块中有return语句...

    JavaScript_引擎技术

    异常处理通过try...catch...finally语句实现,可以捕获并处理运行时错误。 JavaScript支持对象实例化,基础类型通过值进行赋值,对象类型则是通过引用。全局对象和局部对象也有特定的用法,如arguments对象在函数...

    水滴检测系统-上位机

    7. **异常处理**:考虑到通信中断、数据错误等情况,VB的Try...Catch...Finally语句可用于捕获并处理可能出现的异常,确保程序的稳定运行。 8. **实时更新**:系统需实时显示吊瓶速度,这需要定时器组件(Timer)来...

    c#多线程源码列子

    // 临界区代码,同一时刻只有一个线程能执行 } } ``` 2. Monitor类:`Monitor.Enter`和`Monitor.Exit`方法可以实现线程互斥,或者使用`using`语句块简化代码: ```csharp private object resource = new object...

    Java多线程问题及处理笔记.doc

    在编写代码时,应尽可能避免设计可能导致死锁的逻辑,例如,通过有序地获取资源,或者使用try/finally语句块来确保资源的正确释放。 2. **线程优先级**: Java允许为线程设置优先级,以影响线程调度。线程优先级...

Global site tag (gtag.js) - Google Analytics