zoukankan      html  css  js  c++  java
  • Java面试try catch finally中return的问题详细分析以及更深层次的问题剖析

    如题,这是Java面试经常遇到的问题。究竟是会reture try里的值还是finally中的值,亦或者finally中会执行吗?下面我们通过代码来分析:

    1 public static int practiceOne(){
    2         try {
    3             System.out.println("try is running");
    4             return 1;
    5         } finally {
    6             System.out.println("finally is running");
    7             return 2;
    8         }
    9     }

    这里输出的结果是:

    try is running
    finally is running
    2

    我们可以看到finally的语句被执行了,因为不管是执行try 还是执行catch 最后都会执行finally中的代码。但是在try return 之前会去执行finally的代码。但是finally的代码中有return 所以程序就return了之后结束了。所以返回的是2。下面我们在加一点难度迷惑一下大家

    public static int practiceTwo(){
            int num=10;
            try {
                num=20;
                return num;
            }finally{
                num=30;
            }
        }

    这里输出的结果是:20。其实,在try 的return 之前已经封存了要返回对象所指向的内存地址。就是说在执行finally之前。程序已经确定了要返回的值的所在的内存地址,而这个内存地址的值就是20所以不会因为finally改变值所影响最后返回的值。有点绕,大家可以去实践一下。

    接下来又要变形了.哈哈

     1 public class Problem {
     2     public static void main(String[] args) {
     3         System.out.println(practiceThree().num);
     4     }
     5     
     6     public static Example practiceThree(){
     7             Example e=new Example();
     8             try {
     9                 e.num=10;
    10                 return e;
    11             }finally{
    12                 e.num=20;
    13             }
    14         
    15     }
    16 }
    17 class Example{
    18     public Example(){
    19         
    20     };
    21     int num;
    22 }

    这里输出的结果是:20。其实就像上面强调的一样,封存的是内存地址。我改变了这个对象的某一个属性值,并没有改变所引用的对象,所以finally会影响最后的结果。

  • 相关阅读:
    操作系统:进程同步
    操作系统:线程的概念
    操作系统:进程的概念与控制
    操作系统:操作系统概述
    CTF-WEB:攻防世界 ics-05(preg_replace() 函数 /e 漏洞)
    《剑指 Offer》学习记录:题 11:旋转数组的最小数字
    《剑指 Offer》学习记录:题 28:对称二叉树
    Linux为什么不是硬实时
    普通线程和内核线程
    linux内核栈和用户栈
  • 原文地址:https://www.cnblogs.com/lionels/p/7112957.html
Copyright © 2011-2022 走看看