java-JAVA finally内的处理在什么情况下会影响到返回值?

问题描述

JAVA finally内的处理在什么情况下会影响到返回值?

例子如下,返回结果不同,前两个方法为finally没处理前的结果,而后一个方法的返回值为处理后的结果。请问这是为什么。

public class Test {
public static void main(String[] args) {
System.out.println(test1());
System.out.println(test2());
System.out.println(test3());
}

private static int test1()
{
int n=1;
try
{
return n;
}
finally
{
n=n+1;
}
}

private static String test2()
{
String x = new String();
x="xxx";
try
{
return x;
}
finally
{
x=x+"a";
}
}

private static StringBuffer test3()
{
StringBuffer b = new StringBuffer();
b.append("xxx");
try
{
return b;
}
finally
{
b.append("a");
}
}
}

解决方案

首相finally{}的执行时间是在try{}中间的return返回的中间或者是之后。准确的说是在return语句的中间,但是可以理解为return之后。所以第一种情况的结果必然是1,因为此时的n是1。
第二种情况是String,这里要理解String的特性,String是不可变的,是内容不可以变的,但是应用是可变的。在finally执行之前已经return了String的一个引用了,此String的引用指向的是xxx。所以即使后面的String所指向的内容已经变化但是对之前那个不造成影响。
第三种情况是,StringBuffer,String与Stringbuffer之间的不同是,String是内容不可以变,而Stringbuffer是内容可变。所以返回的StringBuffer的引用之后,在finally里面对b所指向的引用内容进行了改变,虽然引用b的地址值没有改变,但是到main方法里面时,b所指向的内容已经变化了,所以打印出来的结果也是变化后的结果。
对于这个try{}finally{}的执行顺序理解之后,加上对每个数据类型的特点有比较深的理解就可以理解这类问题了。
希望我的回答对你有帮助

时间: 2024-10-29 07:28:26

java-JAVA finally内的处理在什么情况下会影响到返回值?的相关文章

java getProtectionDomain问题,有谁知道在什么情况下会找不到路径

问题描述 java getProtectionDomain问题,有谁知道在什么情况下会找不到路径 这是代码 Paths.get(ClassesPathWatch.class.getProtectionDomain().getCodeSource().getLocation().getPath().replaceAll("^/", "").replaceAll("%20", " ")); 在我本机上会获得 c:xxxx/xxxx

Java理论与实践:在没有数据库的情况下进行数据库查询

我最近仔细考察了一个项目,该项目涉及相当多的 Web 快速搜索.当爬虫程 序爬过不同的 Web 站点时,它将建立一个数据库,该数据库中包括它所爬过的 站点和网页.每一页所包含的链接.每一页的分析结果等数据.最终结果是一组 报告,详细说明经过了哪些站点和页面.哪些是一直链接的.哪些链接已经断开 .哪些页面有错误.计算出的页面规格,等等.开始的时候,没人确切知道需要 什么样的报告,或者应当采用什么样的格式 -- 只知道有一些内容要报告.这 表明报告开发阶段会是一个反复的阶段,要经过多次反馈.修改,并

Java判断时间段内文件是否更新的方法_java

本文实例讲述了Java判断时间段内文件是否更新的方法.分享给大家供大家参考.具体实现方法如下: 1.定时器 复制代码 代码如下: private Timer timer;    /** * 简易定时器 * @param delay  多久后开始执行.毫秒 * @param period 执行的间隔时间.毫秒 */  public void test(long delay, long period) {          timer = new Timer();          timer.sc

Java的进程内缓存框架:EhCache (转)

EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. Ehcache缓存的特点: 1. 快速. 2. 简单. 3. 多种缓存策略 4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题 5. 缓存数据会在虚拟机重启的过程中写入磁盘 6. 可以通过RMI.可插入API等方式进行分布式缓存 7. 具有缓存和缓存管理器的侦听接口 8. 支持多缓存管理器实例,以及一个实例的多个缓存区域 9. 提供Hibernate的缓存实现  

Java按照List内存储的对象的某个字段进行排序的实例_java

关键点:将List内存储的对象实现Comparable类,重写它的compareTo()方法即可 Bean: package chc; public class StuVo implements Comparable<StuVo>{ private String id; private String name; private Integer age; public StuVo(String id, String name, Integer age) { this.id=id; this.na

如何排查Java内存泄露(内附各种排查工具介绍)

今天刚刚才加一个故障review会议, 故障非常典型, google下也可以找到相似案例介绍. 在排查问题的过程中,使用了大量的工具, 发现有问题的地方还不只一个,总结一下. (本篇文章不会重点描述案例本身,重点会介绍个人对java内存泄露问题的排查思路和各种工具的使用). java内存泄露典型特征 现象一: 堆/Perm 区不断增长, 没有下降趋势(回收速度赶不上增长速度), 最后不断触发FullGC, 甚至crash(如下**两张图是同一个应用的GC和Perm数据, GC触发原因确认是Per

什么是Java ?Java详解之深入JAVA

数据类型 任何编程语言都免不了要定义变量,JAVA也不例外.JAVA的变量声明形式如下: type name; 其中的type是数据类型名,name指定义的该数据类型的一个具体变量. JAVA的内置数据类型主要有如下几种: boolean: 布尔值,仅有两个常量,true和false. byte:字节类型值,长度8位(一个字节),取值范围是-128至127. short:短整型值,长度16位(两个字节),取值范围是-32768至32767. int:整型值,长度32位(四个字节),取值范围是-2

多线程- 我的java难道是盗版吗(调用有返回值的函数无响应)

问题描述 我的java难道是盗版吗(调用有返回值的函数无响应) boolean flag = pcSystem.returnTenderResult(bidDocu,tenderDocu); 我在自定义pcSystem类中调用一个具有boolean返回值的函数returnTenderResult(synchronized) 这条语句的上一条语句都会执行,而returnTenderResult内方法一定概率上不执行 (方法内的第一条语句都没有执行,还不涉及方法内具体逻辑),系统涉及了多线程, 这是

c#调用java写的wsdl,接收不到返回值

问题描述 c#调用java写的wsdl,接收不到返回值 c#引用一个java写的wsdl,调用服务里的一个返回值为string 的方法,报以下异常: {"接收对 http://172.17.175.162/swsso/services/SsoWebService 的 HTTP 响应时发生错误.这可能是由于服务终结点绑定未使用 HTTP 协议造成的.这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致.有关详细信息,请参见服务器日志."} http://172.17.