如果catch语句正在返回,那么为什么它最终会被阻塞?

时间:2017-03-17 08:35:58

标签: java

package com.ami.practice;
public class UnrechebleStatement {
public static void main(String[] args) {
    System.out.println(m());
        }

public static int m(){
    try{
        int x=0;
        int y=10/x;
        return y;
    }catch(Exception e){
        return 1;
    }finally {
        return 2;
    }
  }
}

3 个答案:

答案 0 :(得分:3)

来自JLS#14.17

  

带有Expression的return语句尝试将控制权转移给包含它的方法的调用者; Expression的值成为方法调用的值。更确切地说,执行这样的return语句首先评估Expression。如果表达式的评估由于某种原因突然完成,则返回语句因此而突然完成。如果表达式的评估正常完成,产生值V,则return语句突然完成,原因是返回值为V.

     

[...]

     

前面的描述说“尝试转移控制”而不仅仅是“转移控制”,因为如果在try块或者catch子句包含return语句的方法或构造函数中有任何try语句(§14.20),那么任何最终在将控制权转移给方法或构造函数的调用者之前,这些try语句的子句将按顺序执行,最内层到最外层。突然完成finally子句可能会破坏由return语句启动的控制权转移。

特别是第二部分应该完美地回答你的问题

答案 1 :(得分:1)

最后总是执行阻止...执行尝试或抓住......

答案 2 :(得分:1)

除了在某些情况下,总是被称为 1)如果调用System.exit() 2)如果jvm崩溃了 3)如果我们使用嵌套的try catch