关于Java里try/catch/finally/有return时执行过程

Java代码:

public class Test1 {
  public static void main(String[] args) {
    int a=method1();
    System.out.println("result----a="+a);
}

public static int method1(){
  int a=0;
  try {
    a=1;
    System.out.println("try----a="+a);
    return a;
  } catch (Exception e) {
     a=2;
     System.out.println("catch----a="+a);
    return a;
  }finally{
    a=3;
    System.out.println("finally----a="+a);
    //return a;
  }
}
}

输出结果:

try----a=1
finally----a=3
result----a=1

无论try里面有没有return,finally里的代码都会执行。加断点可以看到,执行到try里的return时,后面会走到finally里去,finally执行完以后再次跳到try里的return语句执行返回。finally里的语句执行了,但是最终返回的结果a的值是try里赋的值,而不是finally里赋的值,这是因为在try里执行到return的时候把return的结果已经暂存起来了,然后去执行finally里的代码,这时候finally里的代码不能影响方法最终的返回值,finally里的代码执行完以后再返回到try里的return,将暂存的结果返回(官方文档)。但是如果在finally里有return,则返回值是finally里的值。

例如将finally里的return语句取消注释,则

输出结果:

try----a=1
finally----a=3
result----a=3

时间: 2024-10-10 01:45:05

关于Java里try/catch/finally/有return时执行过程的相关文章

关于Java中try catch finally throw return的执行顺序问题

try {          normal statement;     //1.          exception occurred;   //2.          return "try";      } catch (Exception ex) {     normal statement;     //3.          return "catch";      } finally {          normal statement;     

Java try、catch、finally及finally执行顺序详解(转)

1.为什么要用finally先看一个没有finally的异常处理try-catch语句:假设count为要使用到的资源,并且用完要求释放此资源.那么我们可以把释放资源的语句放到try-catch后执行,当前的程序不管是在执行完try语句块还是catch语句块,都会顺序执行到下面释放资源的语句. int count = 0; //初始化资源 try{ count++; if(count == 1) throw new Exception("Exception in try"); }cat

Java中JIN机制及System.loadLibrary() 的执行过程

Android平台Native开发与JNI机制详解 http://mysuperbaby.iteye.com/blog/915425 个人认为下面这篇转载的文章写的很清晰很不错. 注意Android平台上的JNI机制使用包括Java代码中调用Native模块以及Native代码中调用Java模块. http://www.ophonesdn.com/article/show/263(misybing:很遗憾该站已经挂掉) 众所周知,OPhone平台上的应用开发主要基于Java语言,但平台完全支持且

python\java\c\解释性语言\编译性语言 程序执行过程

c时纯粹的编译性语言,执行过程如下图: 可以看出c是通过预处理器.编译器.汇编器和链接器生成可执行的二进制目标文件,然后直接运行(编译性语言的本质).  Java和python是解释性语言,但并不是纯粹的解释性语言,准确来说是源文件被解释器加载或者显式地进行字节码编译之后,生成字节码文件,运行时字节码文件直接在解释器上边解释边运行(解释性语言的本质). java执行过程: a.java(源文件)----->a.class(字节码文件)----->解释器上直接运行 python执行过程 a.py

Java finally语句到底是在return之前还是之后执行?

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的: (1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到. (2)在try块中有System.exit(0);这样的语句,System.exit(0);

(转)Java finally语句到底是在return之前还是之后执行?

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的: (1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到. (2)在try块中有System.exit(0);这样的语句,System.exit(0);

Java finally语句与return语句执行顺序解析

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的: (1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到. (2)在try块中有System.exit(0);这样的语句,System.exit(0);

【转】Java finally语句到底是在return之前还是之后执行?

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过试验,至少有两种情况下finally语句时不会被执行的: (1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到. (2)在try块中有System.exit(0);这样的语句,System.exit(0);是

JAVA小知识点-Finally和Return的执行关系

如果Try和Catch中存在return语句的时候Finally内的语句是否会执行,执行的时候对结果又有什么影响呢?我写了个例子来试验这个问题: public static Map<String, String> getMapTry() { Map<String, String> map = new HashMap<String, String>(); map.put("KEY", "INIT"); try { map.put(&