try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
也许你的答案是在return之前,但往更细地说,我的答案是在return中间执行(?),请看下面程序代码的运行结果:
public class TestFinally {
public static void main(String[] args) {
System.out.println(test());
}
static int test() {
int x = 1;
try {
return x;
} finally {
++x;
}
}
}
---------执行结果---------
1
运行结果是1,为什么呢?
主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。 (这个比喻好费解==!)
类似题
下面的程序代码输出的结果是多少?
public class TestFinally {
public static void main(String args[]) {
TestFinally t = new TestFinally();
int a = t.get();
System.out.println(a);
}
public int get() {
try {
return 1;
} finally {
return 2;
}
}
}
---------执行结果---------
2
我可以通过下面一个例子程序来帮助我解释这个答案,从下面例子的运行结果中可以发现,try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。
在讲解答案时可以用下面的程序来帮助分析:
public class TestFinally {
public static void main(String[] args) {
System.out.println(new TestFinally().test());
}
int test() {
try {
return func1();
} finally {
return func2();
}
}
int func1() {
System.out.println("func1");
return 1;
}
int func2() {
System.out.println("func2");
return 2;
}
}
---------执行结果---------
func1
func2
2
结论:finally中的代码比return和break语句后执行
========================================================================
上面解释好费解
我的理解是:try中语句return后还得等finally语句执行,如果finally中有return,则finally中return的值替代了try中return的值,最后再返回。也就是finally一定会执行。不知道准不准确。~~
扩展:
final, finally, finalize的区别:
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize
方法,以配置系统资源或执行其他清除。
分享到:
相关推荐
一,谈谈final, finally, finalize的区别。 java面试题
1.4 JAVA面试题解惑系列(四)——final、finally和finalize的区别 1.5 JAVA面试题解惑系列(五)——传了值还是传了引用? 1.6 JAVA面试题解惑系列(六)——字符串(String)杂谈 1.7 JAVA面试题解惑系列(七)...
大公司的Java面试题集 大公司的Java面试题集 第一,谈谈final, finally, finalize的区别。 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一...
本套Java面试题大全,全的不能再全,需要的朋友可下载试试!一、Java基础知识面试题 1、Java概述 2、基础语法 3、面向对象 4、IO流? 5、反射 6、网络编程 7、常用API 8、常用工具类库 9、单元测试 10、日志 二、...
个人整理的多家.Net开发面试题,包括类和结构的区别,死锁的必要条件,接口是否可以继承接口,构造器,final,finally,finallize的区别,C#中委托,进程和线程
选择了一些经常问到的java面试题,及建议答案,希望对各位面试者有用。 描述final﹑finally和finalize的区别。 编程题:使用JavaScript和HTML编写网页实现如图一所示计算功能: 购买总价=购买价格×购买数量。
hashmap的底层原理 hashmap产生死锁的原因 hashmap的容量为什么一定要是2的幂呢 TreeMap的底层原理 HashMap,Hashtable和ConcurrentHashMap的区别 ...还有好多,不想写了,太多了,都是题主呕心沥血总结的
谈谈final, finally, finalize的区别。 final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将...
面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...
50.JAVA语言如何进行异常处理,关键字:thorws,throw,try,catch,finally 51.Object类(或者其子类)的finalize()方法在什么情况下被调用? 52.一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握...
最新Java面试题汇总 sleep() 和 wait() 有什么区别、final, finally, finalize的区别、面向对象的特征有哪些方面、ArrayList,Vector, LinkedList的存储性能和特性等诸多面试常见题目
面试题目: 1-10题: 1、java中==和equals和hashCode的区别 2、int与integer的区别 3、String、StringBuffer、StringBuilder区别 4、什么是内部类?内部类的作用 5、进程和线程的区别 6、final,finally,...
Java面试题大全 JAVA相关基础知识 多态性 final, finally, finalize的区别。
典型JAVA面试试题及答案。谈谈final, finally, finalize 的区别?final 是一个修饰符, 修饰类的时候表示类不可继承, 所以一个类不可能既是abstract 又是final 的; 修饰变量的时候表示这个变量不可被更改并且必须赋...
核心内容在于介绍java面试方面经常提到的关于异常处理方面的面试题,其中包括异常的基本结构、throwable、exception、try-catch-finally、以及其中对应的八股文和部分源码,在应付面试以及平常工作coding期间还是有...
4、final,finally,finalize;5.传了值还是传了引用;6.String杂谈;7.日期与时间的处理;8.基本类型总结;9.继承,多态,重载,重写;10.多线程;11.运算符总结。 适合将要笔试面试Java的朋友参考。
1. 描述final﹑finally和finalize的区别。 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract的,又被声明为final的。将变量声明为final,可以保证...
JAVA面试题,面试前准备下成功率大增 一,谈谈final, finally, finalize的区别。 Final --修饰符(关键字)。如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此 一个类不能既...
Java面试题是针对Java编程语言的技术和知识的一系列问题,用于考察面试者在Java开发方面的能力和经验。Java面试题通常涵盖以下几个方面: 基础知识:包括Java语法、数据类型、运算符、流程控制等基本概念和特性。 ...