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. Elasticsearch 5.0 —— Head插件部署指南

    使用ES的基本都会使用过head,但是版本升级到5.0后,head插件就不好使了.下面就看看如何在5.0中启动Head插件吧! 官方粗略教程 Running with built in server ...

  2. ASP.Net中通过Jquery前端对Repeater控件绑定的数据进行操作

    说明:由于Repeater控件是动态绑定,通过Id获取数据只能默认获取第一行: 1.对Repeater中div设置样式 2.通过$(".css").each(function(){ ...

  3. Atitit learn by need 需要的时候学与预先学习知识图谱路线图

    Atitit learn by need 需要的时候学与预先学习知识图谱路线图 1. 体系化是什么 架构 知识图谱路线图思维导图的重要性11.1. 体系就是架构21.2. 只见树木不见森林21.3. ...

  4. iOS-Runtime在开发中的使用及相关面试题

    OC语言中最为强大的莫过于OC的运行时机制-Runtime,但因其比较接近底层,一旦使用Runtime出现bug,将很难调试,所以Runtime在开发中能不用就不用.下面我将介绍一些Runtime在开 ...

  5. div非弹出框半透明遮罩实现全屏幕遮盖css实现

    IE浏览器下设置元素css背景为透明: background-color: rgb(0, 0, 0); filter: alpha(opacity=20); 非IE浏览器下设置元素css背景为透明: ...

  6. SSISDB3:Environments 和 Environment Variables

    Environment 是ETL执行时使用的Parameters的集合,可以为一个Project引用不同的Environment variables,从而改变ETL执行的属性. 查看Environme ...

  7. IOS下载查看PDF文件(有下载进度)

    IOS(object-c) 下载查看 PDF 其实还是蛮容易操作的.在下载前,首先要把 IOS 可以保存文件的目录给过一遍: IOS 文件保存目录 IOS 可以自定义写入的文件目录,是很有限的,只能是 ...

  8. sizzle分析记录:分解流程

    <form> <label>Name:</label> <input name="name" /> <fieldset> ...

  9. Ubuntu杂记——链接ln的使用:创建和删除符号链接

    原文链接:http://blog.csdn.net/janpylx/article/details/6761910 一 . 使用方式 ln [option] source_file dist_file ...

  10. 如何利用Python生成随机密码

    写了个程序,主要是用来检测MySQL数据库的空密码和弱密码的, 在这里,定义了三类弱密码: 1. 连续数字,譬如123456,在get_weak_num中实现 2. 连续字母,譬如abcdef,在ge ...