【Java基础篇】 try中return A,catch中return Bfinally中return C,最终返回值是什么?

在这里插入图片描述

try中return A,catch中return Bfinally中return C,最终返回值是什么?

  • ✔️典型解析
  • ✔️拓展知识仓
    • ✔️finally 和 return 的关系
  • ✔️ final、finally、finalize有什么区别
    • ✔️final
    • ✔️finally
    • ✔️ finalize


✔️典型解析


最终的返回值将会是C


因为 finally块总是在 trycatch 块之后执行,无论是否有异常发生。如果finally块中有一个return语句,它将夏盖try块和catch块中的任何return语句。


//无异常情况
public static string getValue() {try {return "A" ;} catch (Exception e) {return "B" ;} finally {return "C" ;}
}//有异常情说
public static string getValue() {try {System.out.println( 1 / 0 );return "A" ;} catch (Exception e) {return "B" ;} finally {return "C" ;}
}

所以在这种情况下,无论 trycatch 块的执行情况如何,finally 块中的 return C ;总是最后执行的语句并目其返回值将是整个代码块的返回值。


这个问题还有一个孪生问题,那就是如下代码得到的结果是什么:


public static void getValue() {int i = 0;try {i = 1;} catch (Exception e) {i = 3;} finally {i = 5;}System.out.println(i);
}

原理和上面的是一样的,最终输出内容为5。


✔️拓展知识仓


✔️finally 和 return 的关系


很多时候,我们的一个方法会通过return返回一个值,那么如以下代码:


public static int getValue()  {int i = 1;try {++i;return i;}  catch (Exception e)  {i = 66;} finally {i = 100;}return i;
}

这人代码得到的结果是2,try-catch-finally的执行顺序是try->finally或者try-catch-finally,然后在护行每一个代码块的过程中,如果遇到return那么就会把当前的结果暂存,然后再执行后面的代码块,然后再把之前暂存的结果返回回去。


所以以上代码,会先把 ++i 即 2 的结果暂存,然后执行 i=100,接着再把 2 返回。


但是,在执行后续的代码块过程中,如果遇到了新的 return ,那么之前的暂存结果就会被覆盖。如:


public static int getValue() {int i = 1;try {i++;return i;} catch (Exception e)  {i = 66;} finally {i = 100;return i;}
}

以上代码方法得到的结果是100,是因为在finally 中遇到了一个新的 return ,就会把之前的结果给覆盖掉。


如果代码出现异常也同理:


public static int getValue() {int i = 1;try {++i;System.out.println( 1 / 0 );return i;} catch (Exception e)  {i = 66;} finally {i = 100;return i;}
}

在try中出现一个异常之后,会执行 catch,在执行 finally ,最终得到 100。如果没有finally :


public static int getValue() {int i = 1;try {i++;System.out.println( 1 / 0 );return i;} catch (Exception e)  {i = 66;return i;}
}

那么得到的结果将是66。


所以,如果 finally 块中有 return 语句,则其返回值将是整个 try-catch-finally 结构的返回值。如果 finally 块中没有 return 语句,则 trycatch 块中的 return 语句 (取决于哪个执行了) 将确定最终的返回值。


注意:我在上面的示例代码中一会使用 ++i,一会使用 i++,这个我要给大家回顾一下,在编程中,对于这个变量自身来讲,前++ 后 ++ 是没有任何区别的。总结如下:

(1)对于变量自身来说,无论将++放在变量名的前面或者后面都是先数值的加1效果,实际上是等价的


(2) a++ 表示先让 a 的数值作为整个表达式的结果,然后再让a自身的数值加1; ++a 表示先让a自身的数值加1,然后再作为整个表达式的结果


✔️ final、finally、finalize有什么区别


final、finally、finalize有什么区别? 这个问题就像周杰、周杰伦和周星驰之间有啥关系的问题一样.其实没啥关系,放在一起比较无非是名字有点像罢了。


final、finally和finalize是Java中的三个不同的概念:
  • final: 用于声明变量、方法或类,使之不可变、不可重写或不可继承

  • finally: 是异常处理的一部分,用于确保代码块 (通常用于资源清理) 总是执行

  • finalize: 是Obiect类的一个方法,用于在对象被垃圾回收前执行清理操作,但通常不推荐使用

✔️final


final是一个关键字,可以用来修饰变量、方法和类。分别代表着不同的含义。


final变量: 即我们所说的常量,一旦被赋值后,就不能被修改。


final int x = 100:
// x = 200;// 编译错误,不能修改final变量的值
public static final string AUTHOR_NAME = "Xinbaobaba":

final方法: 不能被了类重写


 public final void show()  {//.........}

final类: 不能被继承


public final class MyFinalClass  {//......
}

✔️finally


finally是一个用于异常处理,它和try、catch块一起使用。无论是否捕获或处理异常,finally块中的代码总是执行(程序正常执行的情况) 。通常用于关闭资源,如输入/输出流、数据库连接等。


try {//可能产生异常的代码
} catch (Exception e)  {// 异常处理代码
} finally {// 清理代码,总是执行
}

✔️ finalize


finalizeObject 类的一个方法,用于垃圾收集过程中的资源回收。在对象被垃圾收集器回收之前 finalize 方法会被调用,用于执行清理操作(例如释放资源)。但是,不推荐依赖finalize方法进行资源清理,因为它的调用时机不确定且不可靠。


protected void finalize() throws Throwable {//  在对象被回收时执行清理工作
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/323695.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTFHub | 存储型

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习,实训平台。提供优质的赛事及学习服务,拥有完善的题目环境及配套 writeup ,降低 CTF 学习入门门槛,快速帮助选手成长,跟随主流比赛潮流。 0x01 题目描述…

Vue3-36-路由-路由的元数据信息 meta

什么是 meta 简单的理解,meta 就是路由对象 的一个属性对象, 可以 通过这个 属性给 路由对象添加 一些必要的属性值, 在使用路由对象时可以获取到这个属性型对象,从而进行一些其他的逻辑判断。 meta 这个非常的简单,就…

如何使用Docker本地部署一个开源网址导航页并分享好友公网使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

linux 浅练一下哈

1.新建用户test不建家目录不允许登录,uid为10086_____________________ useradd -u 10086 -M -s /sbin/nologin 2.将 /opt 文件夹中所有文件的属主,属组改成,test_______________________ chown -R test.test /opt chown -R …

【mars3d】new mars3d.layer.GeoJsonLayer({实现多孔面遮罩mask: true,

【mars3d】new mars3d.layer.GeoJsonLayer({实现多孔面遮罩 官网测试示例: 1.功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 测试代码: export function showDraw(isFlyTo) { removeLayer() const geoJsonLayer new mars3d.layer.GeoJsonLaye…

DS18B20温度传感器(STM32F103C8T6)串口发送到电脑

DS18B20温度传感器(STM32F103C8T6)串口发送到电脑 电路: 单片机串口DS18B20 https://item.taobao.com/item.htm?id753346246509&skuId5192123304733 代码: 链接:https://pan.baidu.com/s/1kW9866jJ9AQYM4YLc1k…

前端JS加密对抗由浅入深-1

前言: 本文主要讲解,针对前端加密数据传输站点,如何进行动态调试以获取加密算法、秘钥,本次实验不涉及漏洞挖掘,仅为学习演示,环境为本地搭建环境 此次站点加密方式为AES加密方式,现如今越来越…

MySQL数据库主从复制和读写分离

目录 一、MySQL主从复制和读写分离理论 (一)读写分离 1.什么是读写分离 2.为什么要读写分离 3.什么时候要读写分离 4.读写分离原理 5.常见MySQL 读写分离 (1)基于程序代码内部实现 (2)基于中间代理…

React基础应用及常用代码

目录 基础知识 babel.config.js js,html,css,Vue,react,angular,nodejs,webpack,less,ES6,commonjs等的关系 ECMAScript 6(ES6) let、const、var 的区别 Webpack、npm、node关系 props和state区别 通用框架类 ES 6 export React React.Fragm…

数字IC后端实现之Innovus TA-152错误解析(分频generated clock定义错误)

**ERROR: (TA-152): A latency path from the ‘Fall’ edge of the master clock at source pin… Error Code TA-152 在数字IC后端实现innovus中我们经常会看到这类Error,具体信息如下所示。 Error Message **ERROR: (TA-152): A latency path from the ‘Fa…

面试题:谈谈分布式一致性机制 ?

文章目录 前言基本原则与理论2PC3PCPaxosRaftGossipNWR 机制Quorum 机制Lease机制 前言 分布式中一致性是非常重要的,分为弱一致性和强一致性。 现在主流的一致性协议一般都选择的是弱一致性的特殊版本:最终一致性。下面就从分布式系统的基本原则讲起&…

1.4 day4 IO进程线程

使用两个子进程进行文件拷贝&#xff0c;父进程进行资源回收 #include <myhead.h> int main(int argc, const char *argv[]) {//创建一个文件描述符并以只读的方式打开int fd-1;if((fdopen("./test.bmp",O_RDONLY))-1){perror("open error");return…