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
猜你喜欢
- Spring Boot 异常处理异常处理是一种识别并响应错误的一致性机制,异常机制可以把程序中的异常处理代码和正常的业务逻辑代码分离,包装程
- 起源flutter作为一个跨平台的框架,在绘制上体现出了它跨平台的良好性能.那么,它是如何从runApp()后 绘制上屏的呢?本文将与你一起
- Java中有哪些队列ArrayBlockingQueue 使用ReentrantLockLinkedBlockingQueue 使用Reen
- 本文实例讲述了Android+SQLite数据库实现的生词记事本功能。分享给大家供大家参考,具体如下:主activity命名为Dict:代码
- 目录1、如果一个方法或变量是"private"访问级别,那么它的访问范围是:2、代码将打印?3、下面关于hibernat
- Java Collection API提供了一些列的类和接口来帮助我们存储和管理对象集合。其实Java中的集合工作起来像是一个数组,不过集合
- 本文实例为大家分享了java实现银行ATM管理系统的具体代码,供大家参考,具体内容如下功能账户类、首页设计分析① 每个用户一个账户对象,需要
- 使用flatMap列出子目录前面已经看到如何列出指定目录下的文件了。我们再来看下如何遍历指定目录的直接子目录(深度为1),先实现一个简单的版
- 本文实例讲述了C++实现的O(n)复杂度内查找第K大数算法。分享给大家供大家参考,具体如下:题目:是在一组数组(数组元素为整数,可正可负可为
- 现在,我们来讲一下怎么用Java来实现简单画板,要实现的功能有:选择图形(方形、圆形、多边形...)、可以选择颜色。首先,打开windows
- 一.为什么要用线程池先来看个简单的例子1.直接new Thread的情况:public static void main(String[]
- logback输出日志屏蔽quartz的debug等级日志在一个spring的老项目中,使用了logback来作为日志管理,logback.
- 本文主要记录JAVA中对象的初始化过程,包括实例变量的初始化和类变量的初始化以及final关键字对初始化的影响。另外,还讨论了由于继承原因,
- 当前使用的IDEA版本是2020.1。随着IDEA版本的升级,有些插件不再支持,而有些插件变成了收费插件,这些插件将不再推荐。以下列举的,都
- 小程序获取手机号,后端JAVA解密流程代码微信官方文档获取手机号流程地址,先看下最好方便理解下面步骤实现思路,步骤如下1.前端需先调用官方w
- Android异常详情介绍这种异常我遇到以下两种情况: 1. java.lang.IllegalStateException: No wra
- 前言Spring Boot 中提供一个全局的配置文件:application.properties,这个配置文件的作用就是,允许我们通过这个
- 一、基本使用它们是 LockSupport 类中的方法// 暂停当前线程LockSupport.park(); // 恢复某个线程的运行Lo
- Android Studio 打包 jar 及 aar 包创建工程 New -> Module -> Library在gradl
- 网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过