try-catch-finally 与返回值的修改
先看一段java代码,func返回值为int:
public static int func() {
int result = 0;
try {
result = 1;
return result;
} catch (Exception e) {
result = 2;
return result;
} finally {
result = 3;
}
}
正确的返回结果是,func返回1。
原因:
如果finally中没有return语句,但是改变了要返回的值,这里有点类似与引用传递和值传递的区别,分以下两种情况,:
1)如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。
2)如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。
return 是String类型的code:
public static String funcStr() {
String result = "hello";
try {
result = "1";
return result;
} catch (Exception e) {
result = "2";
return result;
} finally {
result = "3";
}
}
该函数返回值为字符串”1”。
返回值是引用数据类型(对象):
public static Person funcPerson() {
Person result = new Person(20);
try {
result.age = 30;
return result;
} catch (Exception e) {
result.age = 40;
return result;
} finally {
result.age = 50;
}
}
static class Person {
public int age;
public Person(int age) {
this.age = age;
}
}
该函数的返回类型是resultPerson,age为50,即在finally中更改了有效。
总结:
如果没有异常出现,而且finally语句中没有return,则会执行try里边的return,并且,会将变量暂存起来(对象存的是引用的地址),再去执行finally中的语句,这时候,如果返回值是基本数据类型或者字符串,则finally相当于更改副本,不会对暂存值有影响;但是,如果返回值是对象,则finally中的语句,仍会根据地址的副本,改变原对象的值。所以上边的例子,返回值的age为50。
try-catch-finally 与返回值的修改的更多相关文章
- java使用Filter过滤器对Response返回值进行修改
转:java使用Filter过滤器对Response返回值进行修改 练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过 ...
- 转:java使用Filter过滤器对Response返回值进行修改
练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过滤器对Response返回值进行修改 有时候在开发过程中会有这样一个 ...
- mongoose返回值无法修改
mongoose 查询方法 find 例:db.collections.find(query,function(err,doc) { 如果var res = doc[0] 是{name:'feife ...
- 存储过程: 存储过程(stored procedure)有时也称为sproc。存储过程存储于数据库中而不是在单独的文件中,有输入参数、输出参数以及返回值等。
存储过程示例一: 执行存储过程方法一: 执行存储过程方法二: 存储过程可以定义返回值: 修改存储过程: 利用存储过程查找三个表内的信息: 练习: 超市管理系统:表一:门店仓库表 MenDian ...
- asp.net模态窗口返回值
个人感觉模态窗口在做网站的时候,使用到的比较少,前段时间在做项目时要实现以模态窗口传值和接收返回值, 模态窗口传值实现比较简单,但是做好后发现在Chrome浏览器中接收不到返回值,修改好Chrome浏 ...
- [Golang]一道考察defer与命名返回值的题目
题目 输出: 4 1 3 解释 当函数有可命名结果形参时,结果形参的初始值被设置为零值,函数的return语句会设置结果形参的值 当函数有可命名结果形参时,defer函数是可以修改它,然后再将它的值返 ...
- const引用返回值
一.引用 引用是别名 必须在定义引用时进行初始化.初始化是指明引用指向哪个对象的唯一方法. const 引用是指向 const 对象的引用: ; const int &refVal = iva ...
- Spring Aop 修改目标方法参数和返回值
一.新建注解 @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Document ...
- jmeter 源码修改返回值中文Unicode编码问题
修改jmeter源码,可能会对其他格式的responseData有一定影响,图片或者其他 在 ListenerNotifier 类中找到 notifyListeners 方法,在其下面添加如下代码: ...
随机推荐
- k8s nodeport下访问请求未被分发到所有node的排错(转)
原文 https://www.myf5.net/post/2343.htm 现象: 从内部某个pod的容器里直接访问service的cluster地址,请求可以被正常转发到各个node上的pod里 但 ...
- Linux系统编程——fcntl
fcntl可实现对指定文件描述符的各种操作,其函数原型如下: int fcntl(int fd, int cmd, ... /* arg */ ); 头文件 #include <unistd.h ...
- 01-JDK环境配置
环境说明: Window server 2008 64位 jdk-7u80-windows-x64 apache-tomcat-7.0.57-windows-x64 1.安装JDK环境配置 JAVA_ ...
- YAML快速入门
https://www.jianshu.com/p/97222440cd08 我们学习Java,都是先介绍properties文件,使用properties文件配合Properties对象能够很方便的 ...
- flutter 列表展示
内容: 1.列表展示 2.轮播图 3.其他 本次的内容也是在上一节的基础上进行操作 我们就搞这个story模块. 目录: story.dart story主页面 import 'package:fl ...
- 网络通信中tcp多客户端连接
网络编程中的tcp实例太多了,自己也写了好几次(羞愧),今天在想一对一的TCP知道怎么写了,可是一对多的怎么办呢?服务器是如何知道要给那个发送数据呢?做开发的同学应该经常听说uid这个属性.可以为什么 ...
- C++中字符串换行(如何拆分为多行)
在C/C++语言中,可能我们要书写的一个字符串太长了,放在一行上影响代码的可读性.这时我们就需要多行书写了. 字符串多行书写有两种规则: 1. 在字符串换行处加一个反斜杠’\’,下一行前不能有空 ...
- 【python】django上传文件
参考:https://blog.csdn.net/zahuopuboss/article/details/54891917 参考:https://blog.csdn.net/zzg_550413470 ...
- 利用jvisualvm使用btrace进行线上调试案例
用途:btrace主要用于线上调试.通过btrace,可在不改动代码的前提下,方便的发现以下问题: 1.定位性能慢的接口服务: 2.实时打印堆栈信息,定位死锁位置: 3.定位占用大量内存空间的代码块: ...
- spring boot 请求地址带有.json 兼容处理
项目以前时spring mvc的,现在升级为spring boot ,有些请求地址带有.json后缀,在请求spring boot项目时,无法匹配控制器,spring boot默认选择禁用后缀模式匹配 ...