Java基础之finally语句与return语句详解
作者:星光_依旧灿烂 发布时间:2021-11-27 19:21:22
一、return语句执行顺序
finally语句是在return语句执行之后,return语句返回之前执行的
package exception;
public class Demo06 {
public static void main(String[] args) {
System.out.println(func());
}
public static int func(){
int a = 10;
try{
System.out.println("try中的代码块");
return a += 10;
}catch (Exception e){
System.out.println("catch中的代码块");
}finally {
System.out.println("finally中的代码块");
if(a > 10){
System.out.println("a > 10,"+"a="+a);
}
}
return a += 50;
}
}
运行结果:
try中的代码块
finally中的代码块
a > 10,a=20
20
注意:
a > 10,a=20的结果说明了return a += 10已经执行了,但是没有直接返回,而是先去执行finally语句的内容,然后再去返回结果
二、覆盖问题
finally块中的return语句会覆盖try块的return返回
package exception;
public class Demo07 {
public static void main(String[] args) {
System.out.println(func());
}
public static int func(){
int a = 10;
try{
System.out.println("try中的代码块");
return a += 10;
}catch (Exception e){
System.out.println("catch中的代码块");
}finally {
System.out.println("finally中的代码块");
if(a > 10){
System.out.println("a>10,"+"a="+a);
}
return 100;
}
}
}
运行结果:
try中的代码块
finally中的代码块
a>10,a=20
100
注意:
(1)如果try中有return语句,finally中也有return语句,最终执行的是finally中的return语句
(2)如果finally代码块中写了return语句,那么finally之后的return语句就变成不可到达的语句,需要注释掉,否则编译不过
如果finally语句没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也有可能不变
(1)测试1
package exception;
public class Demo08 {
public static void main(String[] args) {
System.out.println(func());
}
public static int func(){
int a = 10;
try{
System.out.println("try中的代码块");
return a += 20;
}catch (Exception e){
e.printStackTrace();
System.out.println("catch中的代码块");
}finally {
System.out.println("finally中的代码块");
a += 20;
if(a > 10){
System.out.println("a > 10,a="+a);
}
a += 20;
}
return 200;
}
}
运行结果:
try中的代码块
finally中的代码块
a > 10,a=50
30
注意:
对于基本数据类型来说,finally中对返回值的修改不会影响try中的返回变量的值
(2)测试2
package exception;
import java.util.HashMap;
import java.util.Map;
public class Demo09 {
public static void main(String[] args) {
System.out.println(getMap().get("KEY").toString());
}
public static Map<String,String> getMap(){
Map<String,String> map = new HashMap<>();
map.put("KEY","INIT");
try{
map.put("KEY","try");
return map;
}catch (Exception e){
e.printStackTrace();
map.put("KEY","catch");
}finally {
map.put("KEY","finally");
map = null;
}
return map;
}
}
运行结果:
finally
注意:
对于引用数据类型来说,finally中对返回值的修改会影响try中的返回变量的值
三、异常情况
try块中的return语句在异常的情况下不会被执行
package exception;
public class Demo10 {
public static void main(String[] args) {
System.out.println(func());
}
public static int func(){
int a = 10;
try{
System.out.println("try中的代码块");
a = a/0;
return a += 50;
}catch (Exception e){
a += 15;
System.out.println("catch中的代码块");
}finally {
System.out.println("finally中的代码块");
if(a > 20){
System.out.println("a > 20,a ="+a);
}
a += 10;
}
return a;
}
}
运行结果:
try中的代码块
catch中的代码块
finally中的代码块
a > 20,a =25
35
注意:
try语句块中发生异常,try语句异常后的内容不会执行,return语句也不会执行,执行的是捕获到的catch语句块和finally语句块
try中发生异常时,return写在catch语句中
package exception;
public class Demo11 {
public static void main(String[] args) {
System.out.println(func());
}
public static int func(){
int a = 10;
try{
System.out.println("try中的代码块");
a = a /0;
return a += 10;
}catch (Exception e){
System.out.println("catch中的代码块");
return a += 15;
}finally {
System.out.println("finally中的代码块");
if (a > 10){
System.out.println("a > 10, a = "+a);
}
a += 50;
System.out.println(a);
}
}
}
运行结果:
try中的代码块
catch中的代码块
finally中的代码块
a > 10, a = 25
75
25
注意:
try中发生异常之后,catch中的return语句先执行,确定了返回值之后(保存起来,finally中的语句对返回值无影响)再去finally语句块,执行完之后再返回a的值,finally中对a的修改对返回值无效
四、finally语句一定会被执行吗?
(1)当程序进入try语句之前就出现异常时,会直接结束
(2)try语句块中有强制退出时也不会执行finally语句块中的代码
System.exit(0);
代码示例:
package exception;
public class Demo12 {
public static void main(String[] args) {
int a = 10;
try{
System.out.println("try block");
System.exit(0);
}catch (Exception e){
System.out.println("catch block");
}finally {
System.out.println("finally block");
}
}
}
运行结果:
try block
来源:https://blog.csdn.net/qq_46804966/article/details/116138354


猜你喜欢
- 本文实例为大家分享了Flutter Animation实现缩放和滑动动画的具体代码,供大家参考,具体内容如下Animation对象是Flut
- Java 8 , Lambda + foreach 语法糖, 写起来非常的 cleanpublic static void main(Str
- 本文实例讲述了C#使用iTextSharp设置PDF所有页面背景图功能的方法。分享给大家供大家参考。具体如下:在生成PDF 的时候,虽然可以
- 循环依赖所谓循环依赖就是多个Bean之间依赖关系形成一个闭环,例如A->B->C->...->A 这种情况,当然,最
- SpringBoot整合junitSpringBoot整合junit①还是一样,我们首先创建一个SpringBoot模块。由于我们并不测试前
- 我就废话不多说了,大家还是直接看代码吧~package com.jalor;import java.util.ArrayList;impor
- 前言前面文章我们介绍了Broker是如何将消息全量存储到CommitLog文件中,并异步生成dispatchRequest任务更新Consu
- 目录简介springfox大致原理:SpringBoot整合Swagger2引入依赖编写配置类配置SwaggerSwagger2常用注解使用
- 1.Fanout Exchange介绍Fanout Exchange 消息广播的模式,不管路由键或者是路由模式,会把消息发给绑定给它的全部队
- 要获取Java中的当前时间戳:Timestamp timestamp = new Timestamp(System.currentTimeM
- 方式一:在gradle.properties中写入:#测试环境ENV_TEST=test#开发环境ENV_DEV=dev#生产环境ENV_O
- 项目介绍:Android上最让人头疼的莫过于从网络获取图片、显示、回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你。Unive
- 一、单链表(Linked List)简介二、单链表的各种操作1.单链表的创建和遍历2.单链表的按顺序插入节点 以及节点的修改3.单链表节点的
- 在WPF中,当我们要使用MVVM的方式绑定一个普通对象的属性时,界面上往往需要获取到属性变更的通知,class NotifyObject :
- 一、AXIS调用远程WebService,以国内手机号归属地查询为例 1、wsdl地址:http://ws.webxml.com.
- 题目:将一个数组逆序输出。代码:import java.util.*;public class lianxi31 {public stati
- java 抛出异常处理的方法为了避免调用的人不知道有异常,才抛出异常的,所以是谁掉用的久在哪里处理。说的对吗对.1、throws关键字通常被
- 摘 要1. 生成多个防伪码,防伪码的长度和个数由用户指定。2. 防伪码由"0123456789ABCDEFGHJKLMNPQRST
- Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相
- 配置如下: <!--邀请用户送优惠券规则{邀请人规则:[{邀请人:优惠券ID}],使用邀请码人:优惠券ID},按照邀请人数从小到大配置