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. Java中迭代器

    任何容器类,都必须有某种方法可以插入元素并将它们再次取回,毕竟,持有事物是容器最基本的工作,对于List,add()是出入元素的方法之一,而get()是取出元素的方法之一. 如果从更高层的角度思考,会 ...

  2. 微信小程序客服消息使用指南

    客服消息使用指南 为丰富小程序的服务能力,提高服务质量,微信为小程序提供客服消息能力,以便小程序用户可以方便快捷地与小程序服务提供方进行沟通. 功能介绍 用户可使用小程序客服消息功能,与小程序的客服人 ...

  3. 谈初学Java历程

    学习Java一个月左右,本来很早就想好好静下心来写一点东西了.但由于不想手写,文档写了不知道放在哪好,所以一直拖着.最近注册了博客园,还是挺方便的. 即将大学毕业了,则面临了所以大学生所面临的问题,就 ...

  4. Python框架之Tornado(四)源码之褪去模板外衣的前戏

    执行字符串表示的函数,并为该函数提供全局变量 本篇的内容从题目中就可以看出来,就是为之后剖析tornado模板做准备,也是由于该知识点使用的巧妙,所有就单独用一篇来介绍了.废话不多说,直接上代码: # ...

  5. Enterprise Solution 虚拟测试环境

    在不联网的情况下,一台物理电脑安装数据库服务,VMware创建多个虚拟机,虚拟机中多个客户端并发连接到物理主机.可共用同一个物理主机的数据库,也可以测试多用户并发等问题. 1  安装微软虚拟网卡.在控 ...

  6. Linq 知识回顾

    开篇语 在说LINQ之前必须先说说几个重要的C#语言特性 与LINQ有关的语言特性 隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在fore ...

  7. Android okHttp网络请求之缓存控制Cache-Control

    前言: 前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control. okHttp ...

  8. Javascript与ECMAScript

    我们经常习惯性认为Javascript就是ECMAScript,但其实不是这样的. ECMAScript是一种脚本在语法和语义上的标准. 主要包括:语法.类型.语句.关键字.保留字.操作符.对象. 它 ...

  9. 你所不知道的15个Axure使用技巧

    你有用原型开发工具吗?如果有,那你用的是Axure还是别的? 从以前就喜欢使用Axure,主要是觉得它能清楚的表达设计的思路,还有交互的真实再现,能让看的人一目了然,昨天看了这篇博文,便更加确定Axu ...

  10. 为什么WebSphere好好的,他就不干活了?

    “修理不好用的WebSphere,有时候要看运气.”这个是我接触过很过有历史的运维工程师经常说的一个梗;研发人员也经常说这个程序在我这里运行好好的,怎么到你那就不灵了?问题是你的,你自己解决. 声明一 ...