Java中 return 和finally
1. 最简单的情形
public void main(){
String s = test();
System.out.println("s=[" + s + "]");
}
public String test(){
String s = "";
try{
System.out.println("In try");
s += "try," ;
}catch(Exception ex){
System.out.println("In catch");
}finally{
s += "finally,";
System.out.println("In finally");
}
s+="other";
return s;
}
输出的结果是:
In try
In finally
s=[try,finally,other]
2. 在try中加上return,那么结果是
public String test(){
String s = "";
try{
System.out.println("In try");
s += "try," ;
return s; //加上return
}catch(Exception ex){
System.out.println("In catch");
}finally{
s += "finally,";
System.out.println("In finally");
}
s+="other";
return s;
}
结果是
In try
In finally
s=[try,]
说明虽然会执行finally语句,但是return的结果已经准备好了。然后才执行finally,在执行finally之前,会将返回的结果存储到不同于s的变量中,finally执行成功之后,才会返回对应的结果。因此即使在finally中对结果进行修改,也不会修改返回的结果。
3. 如果在catch中return会怎么样呢?
public String test(){
String s = "";
try{
System.out.println("In try");
s += "try," ;
throwException();
}catch(NullPointerException ex){
System.out.println("In catch");
s += "catch,";
return s;
}finally{
s += "finally,";
System.out.println("In finally");
}
s+="other";
return s;
}
public void throwException() throws NullPointerException{
throw new NullPointerException();
}
执行结果是:
In try
In catch
In finally
s=[try,catch,]
可见道理是一样的,也就是不管在try还是在catch中的语句中return的结果,即使在finally中进行修改,都不会改变结果。
4. return 语句先执行,还是finally先执行呢?
public String test(){
String s = "";
try{
System.out.println("In try");
s += "try," ;
throwException();
}catch(NullPointerException ex){
System.out.println("In catch");
s += "catch,";
return s += testReturn();
}finally{
s += "finally,";
System.out.println("In finally");
}
s+="other";
return s;
}
public String testReturn(){
System.out.println("In Return");
return "return,";
}
public void throwException() throws NullPointerException{
throw new NullPointerException();
}
结果是:
In try
In catch
In Return
In finally
s=[try,catch,return,]
也就是,return还是要比finally先执行,但是这时函数还没急着返回,只有把finally执行完才会返回。
总结的结果是:
1. 不管是否有异常,finally都会执行
2. 即使try或catch中有return语句,finally仍然会执行
3. finally中语句是在return语句之前执行的,即return语句执行就决定了返回的结果
4. return语句执行完如果还有finally块,还会执行finally块,但是无法修改return语句返回的结果
参考资料:
http://www.cnblogs.com/ybwang/archive/2010/10/10/1847269.html
Java中 return 和finally的更多相关文章
- 经典的java中return和finally问题!
经典的java中return和finally问题! 标签: 杂谈 分类: java学习 前一段时间 参加公司的笔试问了这个问题,回来一查才知道当时自己做错了,百思不得其解,上网查到下面的程序,但是运行 ...
- Java中return的语句
1.return语句的作用:a.返回一个值,这个值可以是任意类型.b.使程序返回到操作系统(即终止程序)2.java中对于一个函数,不论有没有返回值类型,都可以带有return 语句.但是区别在于,r ...
- java中return在Try-Catch中的执行顺序
我们知道return会结束此方法并返回指定值.以及在Try-catch-finally中无论try代码块中有没有异常finally中的代码时都会被执行的.但是如果return包含在try-catch- ...
- java中return与finally的执行顺序
可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机.接下来我就带您一步一步的揭开这个 finally 的神秘面纱. 问题分析 首先来问大家一个问题:finally 语句块一定 ...
- Java中Return和Finally运行顺序的实现
以下这段代码的运行结果是如何的呢? [java] view plaincopyprint? publc int test(){ int x; try{ ; return x; }catch(Excep ...
- Java中return返回结果的优先级
在Java开发时,异常处理是非常普遍的.先看这样一道关于异常处理的代码 public static int getNumer() { int a = 1; try { return a; } catc ...
- Java中Return和Finally执行顺序的实现
下面这段代码的执行结果是怎样的呢? publc int test(){ int x; try{ x = 1; return x; }catch(Exception e){ x = 2; return ...
- java 中 return 的两种常见的用法
一:return语句总是用在方法中,有两个作用: 一个是返回方法指定类型的值(这个值总是确定的), 一个是结束方法的执行(仅仅一个return语句). 二:实例1 -- 返回一个String priv ...
- java中return和continue区别
编程语言大多是想通的,当然java也不例外,下面的在其他编程语言也是相同的道理. return与continue的区别 先看代码哦 class demo2 { public static void m ...
随机推荐
- Maven解决Missing artifact com.sun:tools:jar:1.5.0错误
<dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> ...
- 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇06:计分》
6.计分 计分概述: 分值计量直接反应玩家在游戏中获得的成就感.因此,计分系统在游戏中显得尤为重要,有的反应在直接获取的分数上,有的反应在杀敌数量上等. 计分原理: 原理图,如图6-1所示. 图6-1 ...
- js变量申明提前及缺省参数
现在最先的行为准则:js变量申明必须带var:然后开始随笔: 函数中的变量申明在编译的时候都会提到函数开头. 例如: function foo(){ console.log('some code he ...
- Hadoop应用开发实战案例 第1周
本课程的基础课程是,Hadoop数据分析平台课程.相信,能看我本博文的朋友,是有一定的基础了. 只是前个课程是讲解,这个课程是应用. 第一层是:数据源层,代表有生产线上的数据,比如关系型数据库orca ...
- 【转】linux代码段,数据段,BSS段, 堆,栈
转载自 http://blog.csdn.net/wudebao5220150/article/details/12947445 linux代码段,数据段,BSS段, 堆,栈 网上摘抄了一些,自己组 ...
- struts2+Hibernate4+spring3+EasyUI环境搭建之四:引入hibernate4以及spring3与hibernate4整合
1.导入hibernate4 jar包:注意之前引入的struts2需要排除javassist 否则冲突 <!-- hibernate4 --> <dependency> & ...
- DB2日期和时间函数汇总
上一篇提到过在DB2中,可以通过SYSIBM.SYSDUMMY1.SYSIBM.DUAL获取寄存器中的值,也可以通过VALUES关键字获取寄存器中的值.则在这篇中,我们直接用VALUES关键字来看看这 ...
- ocp 1Z0-043 131-205题解析
131. Which three methods can you use to run an Automatic Database Diagnostic Monitor (ADDM) analysis ...
- POJ 2185 Milking Grid(KMP)
Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 4738 Accepted: 1978 Desc ...
- 蓝桥杯 入门训练 Fibonacci数列
入门训练 Fibonacci数列 时间限制:1.0s 内存限制:256.0MB 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. ...