finally块里面的代码一般都是会执行的,除非执行 System.exit(int),停止虚拟机,断电。

1.若try代码块里面有return ,假设要return 的值 是A,A为基本类型或者被final修饰的不可变类型(如:基本类型的包装类型Integer,Double,String ),并且finally语句块里面 对try语句块里面要return 的值A做了修改 比如A+1,但是最终返回的值是不受finally里面对A值操作的影响的。看下面的示例:

1.1范围值为基本类型

   public static void main(String[] args) {
System.out.println(test1());
} // 基本类型 try 中有return ,finally 中改变值 ,最终返回值 不受finally里代码影响
public static int test1(){
int a =20;
try {
System.out.println("test1 try block");
return a+25;
} catch (Exception e) {
System.out.println("test1 catch exception");
} finally {
a = a+10;
}
return a;
}

控制台打印输出:
test1 try block
45

1.2 返回值为基本类型的包装类型(final)

    public static void main(String[] args) {
System.out.println(test3());
} //final类型(不可变)此时是基本类型的包装类型 try 中有return ,finally 中改变值 ,最终返回值 不受finally里代码影响
public static Integer test3(){
Integer a =20;
try {
System.out.println("test3 try block");
return a+25;
} catch (Exception e) {
System.out.println("test3 catch exception");
} finally {
a = a+10;
}
return a;
}

控制台打印输出:

test3 try block
45

1.3 返回值为String类型(final)

    public static void main(String[] args) {
System.out.println(test4());
} //final类型(不可变)此时是String字符串类型 try 中有return ,finally 中改变值 ,最终返回值 不受finally里代码影响
public static String test4(){
String a ="中国";
try {
System.out.println("test4 try block");
return a+"_强大繁荣";
} catch (Exception e) {
System.out.println("test4 catch exception");
} finally {
a = a+"== 强盛!";
}
return a;
}

控制台打印输出:

test4 try block
中国_强大繁荣

2.若try代码块里面有return ,假设要return 的值 是B,B为基本类型或者被final修饰的不可变类型(如:基本类型的包装类型Integer,Double,String ),并且finally语句块里面 对try语句块里面要return 的值A做了修改 比如A+1,并且返回了值A,但是最终返回的值是受finally块里面对A值的操作的影响。看下面的示例:

2.1 返回值为基本类型

    public static void main(String[] args) {
System.out.println(test2());
} // 基本类型 try 中有return ,finally 中改变值 并return改变后的值 ,最终返回值 受finally里代码影响
public static int test2(){
int a =20;
try {
System.out.println("test2 try block");
return a+25;
} catch (Exception e) {
System.out.println("test2 catch exception");
} finally {
return a+5;
}
}

控制台打印输出:

test2 try block
25

2.2 返回值为基本类型的包装类型(final)

    public static void main(String[] args) {
System.out.println(test3());
}
//final类型(不可变)此时是基本类型的包装类型 try 中有return ,finally 中改变值 并返回 ,最终返回值 受finally里代码影响
public static Integer test3(){
Integer a =20;
try {
System.out.println("test3 try block");
return a+25;
} catch (Exception e) {
System.out.println("test3 catch exception");
} finally {
return a+10;
}
//return a;
}

控制台打印输出:

test3 try block
30

2.3 返回值为String类型(final)

    public static void main(String[] args) {
System.out.println(test4());
}
//final类型(不可变)此时是String字符串类型 try 中有return ,finally 中改变值 并返回,最终返回值 受finally里代码影响
public static String test4(){
String a ="中国";
try {
System.out.println("test4 try block");
return a+"_强大繁荣";
} catch (Exception e) {
System.out.println("test4 catch exception");
} finally {
a = a+"== 强盛!";
return a;
}
//return a;
}

控制台输出:

test4 try block
中国== 强盛!

3.若try代码块里面有return ,假设要return 的值是C,C为引用类型并且是没有被final修饰的可变类型,并且finally语句块里面 对try语句块里面要return 的值A做了修改 ,那么不论finally块里面是不是返回了C,函数最终的返回结果都会受到finally块中对C操作的影响。

//定义了一个类型Cat ,引用类型,且是可变类型
class Cat{
private String name;
private int age; public Cat(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
    public static void main(String[] args) {
System.out.println(test5());
} //对于引用类型对象(非final)的, try 中有return ,finally 中改变值 ,最终返回值 受finally里代码影响
public static Cat test5(){
Cat cat = new Cat("tom",12);
try {
return cat;
} catch (Exception e) { } finally {
cat.setName("mouse");
cat.setAge(13);
}
return cat;
}

控制台输出:

Cat{name='mouse', age=13}

    public static void main(String[] args) {
System.out.println(test6());
} //对于引用类型对象(非final)的, try 中有return ,finally 中改变值 并return ,最终返回值 受finally里代码影响
public static Cat test6(){
Cat cat = new Cat("tom",12);
try {
return cat;
} catch (Exception e) { } finally {
cat.setName("mouse");
cat.setAge(13);
return cat;
}
// return cat;
}

控制台输出:

Cat{name='mouse', age=13}

4.总结

当返回值为基本类型或者被final修饰的不可变类型时,基本类型返回的就是值,被final修饰的不可变类型,对其进行修改,就变成了另外一个对象了,对源对象没有影响;

当返回值为引用类型并且是没有被final修饰的类型时,返回的是该对象的地址,对该对象进行修改,那就真正的修改了;

java中 try return finally return的更多相关文章

  1. java中异常处理finally和return的执行顺序

    根据个人亲自测试,得出如下结果: 1.try,catch中有没有return,finnally都会执行,而且是先执行try,catch后,最后执行finnally语句: 2.如果finnally中有r ...

  2. java中异常处理finally和return语句的执行顺序

    finally代码块的语句在return之前一定会得到执行 如果try块中有return语句,finally代码块没有return语句,那么try块中的return语句在返回之前会先将要返回的值保存, ...

  3. java中的finally用return也挡不住

    今晚做了科达的题,有一题就是这个意思,我自以为return中断一切,然而事实摆在眼前:

  4. java中的 break continue return作用详解

    break: 此语句导致程序终止包含它的循环,并进行程序的下一阶段(整个循环后面的语句),即,不是跳到下一个循环周期而是退出循环.如果break语句包含在嵌套循环里,它只跳出最里面的循环. 如下代码: ...

  5. 可惜Java中没有yield return

    项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...

  6. 【转】Java中try catch finally语句中含有return语句的执行情况(总结版)

    Java中try catch finally语句中含有return语句的执行情况(总结版) 有一点可以肯定,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有r ...

  7. java中return与finally的执行顺序

    可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机.接下来我就带您一步一步的揭开这个 finally 的神秘面纱. 问题分析 首先来问大家一个问题:finally 语句块一定 ...

  8. Java中处理异常中return关键字

    Java中,执行try-catch-finally语句需要注意: 第一:return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂 ...

  9. Java基础(2):Java中的四个跳转语句总结goto,break,continue,return

    跳转控制语句 Java中的goto是保留字,目前不能使用.虽然没有goto语句可以增强程序的安全性,但是也带来很多不便,比如说,我想在某个循环知道到某一步的时候就结束,现在就做不了这件事情.为了弥补这 ...

  10. 经典的java中return和finally问题!

    经典的java中return和finally问题! 标签: 杂谈 分类: java学习 前一段时间 参加公司的笔试问了这个问题,回来一查才知道当时自己做错了,百思不得其解,上网查到下面的程序,但是运行 ...

随机推荐

  1. JBoss AS

    即 JBoss Application Server - JBoss Community The JBoss AS community project has been renamed to the ...

  2. Thread.Sleep引发ThreadAbortException异常

    短信平台记录日志模块,是通过异步方式来记录的,即日志工具类里初始化一个Queue对象,公共的写日志方法的处理逻辑是把日志消息放到Queue里.构造器里设定一个死循环,不停的读队,然后把日志消息持久化到 ...

  3. 使用Emit把Datatable转换为对象集合(List<T>)

    Emit生成动态方法部分摘自网上,但是经过修改,加入了对委托的缓存以及类结构的调整,使之调用更简洁方便.大致的思路是:要实现转换datatable到某个指定对象的集合,本质是实现转换一个datarow ...

  4. 用SQL语句创建四个表并完成相关题目-10月18日更新

    1. 查询Student表中的所有记录的Sname.Ssex和Class列. 2. 查询教师所有的单位即不重复的Depart列. 3. 查询Student表的所有记录. 4. 查询Score表中成绩在 ...

  5. OpenGL学习进程(13)第十课:基本图形的底层实现及算法原理

        本节介绍OpenGL中绘制直线.圆.椭圆,多边形的算法原理.     (1)绘制任意方向(任意斜率)的直线: 1)中点画线法: 中点画线法的算法原理不做介绍,但这里用到最基本的画0<=k ...

  6. 12款非常精致的免费 HTML5 & CSS3 网站模板

    01. Joefrey Mahusay 很炫的单页网站模板,基于 HTML5 & CSS3 制作,适合用于设计师个人简历.摄影师和平面设计师的个人作品展示. 演示  下载 02. Folder ...

  7. js实现图片轮播

    效果图

  8. 【开源】OSharp3.3框架解说系列:重新开源及3.3版本新特性

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

  9. AngularJs 动态加载模块和依赖

    最近项目比较忙额,白天要上班,晚上回来还需要做Angular知识点的ppt给同事,毕竟年底要辞职了,项目的后续开发还是需要有人接手的,所以就占用了晚上学习的时间.本来一直不打算写这些第三方插件的学习笔 ...

  10. Android动画学习(一)——Android动画系统框架简介

    2015-11-09补充:Drawable Animation极有可能是Frame Animation 这几天在找工作,面试的时候被问到了Android动画,之前完全没接触过这部分,直接给懵了,当然其 ...