try catch 语句中有return 的各类情况

try catch 语句中有return 的各类情况在牛客上做java题时遇到过多到关于trycatch语句的问题,看了很多答案解析,在这里记录一下。首先给出一道题目:下面代码的运行结果为?publicclasstest{ publicintadd(inta,intb){ try{ returna+b; }catch(Exceptione){ System.out.println("catch语句块")…

大家好,又见面了,我是你们的朋友全栈君。

在牛客上做java题时遇到过多到关于try catch语句的问题,看了很多答案解析,在这里记录一下。

首先给出一道题目:

下面代码的运行结果为?

public class test {
	public int add(int a,int b) {
		try {
			return a+b;
		}catch(Exception e){
			System.out.println("catch语句块");
		}finally {
			System.out.println("finally语句块");
		}
		return 0;
	}
	public static void main(String[] args) {
		test t=new test();
		System.out.println("和是"+t.add(9, 34));
	}

}

A、catch语句块 和是43

B、编译异常

C、finally语句块 和是43

D、和是43 finally语句块

正确答案:C

由于学习过编译原理的课程,知道了System.out.println中要执行add()方法与前面的“和是”字符串拼接后才会输出,因此首先执行add()方法。

add()方法中try语句块中有return语句,那么是否执行完try语句块就直接退出方法了呢?

上述代码在Eclipse下运行此代码结果为:

try catch 语句中有return 的各类情况

看来尽管try语句块中有return,还是会执行finally语句块。

看到了合理的解释是,在try中执行到return语句时,不会真正的return,即只是会计算return中的表达式(本题为执行a+b),之后将结果保存在一个临时栈中,接着执行finally中的语句,最后才会从临时栈中取出之前的结果返回。

下面我们在这道题的finally语句中加入这么一行代码:

a=1;

public class test {
	public int add(int a,int b) {
		try {
			return a+b;
		}catch(Exception e){
			System.out.println("catch语句块");
		}finally {
			System.out.println("finally语句块");
			a=1;
		}
		return 0;
	}
	public static void main(String[] args) {
		test t=new test();
		System.out.println("和是"+t.add(9, 34));
	}

}

结果如何呢?

下面是运行结果截图:

try catch 语句中有return 的各类情况

从结果看出来结果并没有发生改变,这也验证了finally中的语句不会影响到临时栈中的值,即在执行finally之前,临时栈中的值已经确定为43了,执行finally语句将a的值变为1,对结果没有产生影响,执行完finally后的输出结果仍为43.

有了这些认识之后,我们讨论一下try,catch,finally中有return语句的几种情况。

第一种:try{}catch(){}finally{}return;

该情况语句后顺序执行。(不考虑异常)

第二种:try{return;}catch(){}finally{}return;

该情况为刚才说的题目情况,即执行完try语句块,将return的值保存在临时栈中,再执行finally语句块,之后返回临时栈中的值。

第三种:try{}catch(){return;}finally{}return;

无异常:执行try,执行finally,再执行return;

有异常:执行完catch语句块,将return的值保存在临时栈中,再执行finally语句块,之后返回临时栈中的值。

第四种:try{}catch(){}finally{return;}

执行finally中的return语句。

第五种:try{return;}catch(){return;}finally{};

根据有无异常执行和情况二或情况三。

第六种:try{return;}catch(){}finally{return;}

执行完try语句块,将return的值保存在临时栈中,再执行finally语句块,因为finally中有return,所以返回finally中的return值。

第七种:try{}catch(){return;}finally{return;}

执行完catch语句块,将return的值保存在临时栈中,再执行finally语句块,因为finally中有return,所以返回finally中的return值。

第八种:try{return;}catch(){return;}finally{return;}

有异常:执行情况七。

无异常:执行情况六。

注意:finally中最后不要有return语句,在编译器中会报警告。

总结:

在正常情况(即程序正常执行try catch finally语句块,不会在语句中出现退出程序、线程终止等特殊情况)下,都会执行finally语句块,如果finally中有return,则程序会走finally中的return,如果没有,则先执行try或者catch中的return,将其存入临时栈中,执行完finally语句后才返回临时栈中的值。

————————————————————————————————————————

刚看到了有人总结过类似的文章,比我总结的更清楚。

链接:https://blog.csdn.net/ns_code/article/details/17485221

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148048.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Repeater控件的ItemDataBound事件

    Repeater控件的ItemDataBound事件Repeater控件的ItemDataBound事件:在项被绑定数据后触发。下面的例子来自msdn,不过我把前台和后台分开了。前台是:ViewCode<%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="WebForm1.aspx.cs"Inherits="WebApplication2.WebForm1…

    2022年10月13日
  • css画三角形

    css画三角形实现原理将div的高和宽设置为0,然后设置四个border不同的颜色。效果如下:div#triangle{width:0;height:0;border-top:50pxsolidblue;border-right:50pxsolidred;border-bottom:50pxsolidgreen;bord…

  • angular入门教程_初学者织围巾简单教程慢动作

    angular入门教程_初学者织围巾简单教程慢动作课程介绍本课程是一个系列基础教程,目标是带领读者上手实战,课程以新版本Angular的3个核心概念作为主线:组件、路由、模块,加上业务开发过程中必须用到的特性:工具、指令、表单、RxJS、i18n、测试,一共分为9部分,34篇文章。除了组件、路由、模块这3个核心小节具有很强的关联性之外,其它内容都是完全独立的,您可以在用到的时候再翻阅。认真读完这个系列文章之后,您会深入理解…

    2022年10月21日
  • 2022年计算机考研过线就能上的学校[通俗易懂]

    2022年计算机考研过线就能上的学校[通俗易懂]部分考研同学本科是双非计算机类专业,基础能力一般,编程能力较弱,那么对于这类考生,主要还是以求稳为主,选择一个分数略低,复试较简单的学校,上岸几率就会加大。那么2022年计算机考研过线上岸率高的院校有哪些呢?

  • 木马免杀方式_木马入侵的常见方法

    木马免杀方式_木马入侵的常见方法前言免杀,又叫免杀毒技术,是反病毒,反间谍的对立面,是一种能使病毒或木马免于被杀毒软件查杀的软件。它除了使病毒木马免于被查杀外,还可以扩增病毒木马的功能,改变病毒木马的行为。免杀的基本特征是破坏特征,有可能是行为特征,只要破坏了病毒与木马所固有的特征,并保证其原有功能没有改变,一次免杀就能完成了。免杀技术也并不是十恶不赦的,例如,在软件保护所用的加密产品(比如壳)中,有一些会被杀毒软件认为是木马病毒;一些安全领域中的部分安全检测产品,也会被杀毒软件误杀,这时就需要免杀技术来应对这些不稳定因素。1、裸

  • 安卓udp发包工具_好装逼牌udp-tcp发包工具

    安卓udp发包工具_好装逼牌udp-tcp发包工具这是好装逼牌udp-tcp发包工具,界面看着好像很牛逼,是不是草包自己实验吧,听说可以穿透安全狗和金盾冰盾之类的防火墙,黑软有风险使用需谨慎,不过玩黑软也有好处,有可能警察叔叔会帮你解决住房问题和吃住问题==!你懂吗?软件特点1.可收发TCP/UDP数据。2.对于TCP,支持服务器和客户端模式。3.支持多连接,可同时对多路网络连接进行操作。4.对于UDP,支持组播方式。5.可显示当前数据传输速度…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号