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)


相关推荐

  • windows类书的学习心得

    windows类书的学习心得这篇文章应该是凑的,不够很长,还是值得读的,转发来。下满是原网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html创建人:paul现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千,很多陌生的出版社,很多陌生的作者,很多陌生的译者,书名也是越来越夸张,什

  • 结构体指针赋值[通俗易懂]

    结构体指针赋值[通俗易懂]//方法1:可以给p分配一段内存空间,并使其指向此空间:#includemain(){structabc{inta;};structabc*p;p=(structabc*)malloc(sizeof(structabc));p->a=1;printf(“%d\n”,p->a);}//方法2:可以让p指向一个已存在的内存空间:#i

  • 《前端运维》一、Linux基础–02用户与权限

    其实说真的,这些基础挺枯燥的,内容呢绝大多数都是些静态的。上一篇文章我们学习了基本的指令和vim编辑器的操作方法。这篇文章我们主要来学习下Linux中用户的概念和权限相关的知识。一、用户与用户组

  • 美国城市地名简称_外国地名英文

    美国城市地名简称_外国地名英文近期在做某个项目要用到美国的地名,上网查了一圈都没有比較具体的、专业的,仅仅好自己复制了一个大概有500多个城市、城镇的英文,用谷歌翻译一下,结果例如以下:谷歌翻译结果,非常多是错误的,边用边改美国地

  • js中判断数组中是否包含某元素的方法有哪些_js判断数组里面是否包含某个元素

    js中判断数组中是否包含某元素的方法有哪些_js判断数组里面是否包含某个元素方法一: arr.indexOf(某元素):未找到则返回-1。 实际用法:if(arr.indexOf(某元素)>-1){//则包含该元素}1例:varfruits=["Banana","Orange","Apple","Mango"];vara=fruits.indexOf("Apple");//2//以上输出结果意味着"Apple"元

    2022年10月19日
  • Java面试基本问题

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 Q1。解释JDK,JRE和JVM? JDK JRE JVM Java开发工具包。 Java运行时环境。 Java虚拟…

发表回复

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

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