return 两个值_面试官:当return遇到try、catch、finally时会发生什么?

e4fb636d8bbfcecbe1444330bf79a4b4.gif

1.return的作用

在Java中的return语句和方法有密切的关系,return语句用在方法中,有两个作用,一个是返回方法指定类型的值(这个值总是确定的),一个是结束方法的执行(仅仅一个return语句)。就像下边这样:

package com.albertyy.other;
public class Return { public static void main(String[] args) { System.out.println(method1()); System.out.println(method2()); } //返回方法指定类型的值 public static int method1(){ return 1; } //在循环中使用,帮助你跳出或中止循环 public static int method2(){ int count = 0; for (int i = 0; i < 10; i++) { count++; if(count==5){ return count ; } } return count; }}

运行结果:

1

5

return有一个特性就是一旦调用return 那么就会直接结束当前方法的运行。

2.try,catch,finally的作用

在Java中有检查异常和非检查异常(运行时异常)两种异常:

运行时异常,编译时不被检查的异常,不需要强制捕获,编译也能通过,他们是RuntimeException的子类。检查异常,编译时被检测的异常,需要用try、catch对异常进行处理,编译才能通过。

try,catch,finally的用法:

try{  //需要被检测的异常代码}catch(Exception e){    //异常处理,即处理异常的代码}finally{  //一定会被执行的代码}

3.return遇到try、catch、finally时会发生什么

上文中我们提到,一旦调用return 就会直接结束方法的运行,finally中的代码一定会执行,那么当我们在try{}代码块中return之后会发生什么?

package com.albertyy.other;
public class AlbertTest { public static void main(String[] args) { System.out.println(method()); } public static int method() { int i = 1; try { i++; System.out.println("try block, i = " + i); return i; } catch (Exception e) { i++; System.out.println("catch block i = " + i); return i; } finally { i = 10; System.out.println("finally block i = " + i); } }}

运行结果:

try block, i = 2

finally block i = 10

2

结果和你想的一样吗?当try中带有return时,会先执行return前的代码,然后暂时保存需要return的信息,再执行finally中的代码,最后再通过return返回之前保存的信息。所以,这里方法返回的值是try中计算后的2,而非finally中计算后的10。

当finally中带有return的时候又会出现什么结果呢?

package com.albertyy.other;
public class AlbertTest { public static void main(String[] args) { System.out.println(method()); } public static int method() { int i = 1; try { i++; System.out.println("try block, i = " + i); return i; } catch (Exception e) { i++; System.out.println("catch block i = " + i); return i; } finally { i = 10; System.out.println("finally block i = " + i); return i; } }}

运行结果:

try block, i = 2

finally block i = 10 

10

当finally中有return的时候,try中的return就会失效,在执行完finally的return之后,直接结束方法。这种写法,编译是可以编译通过的,但是编译器会给予警告,所以不推荐在finally中写return。

总结:

1.java的异常处理中,在不抛出异常的情况下,程序执行完try里面的代码块之后,该方法并不会立即结束,而是继续试图去寻找该方法有没有finally的代码块,如果没有finally代码块,整个方法在执行完try代码块后返回相应的值来结束整个方法。

2.如果有finally代码块,不管有没有异常,finally中的代码都会执行。当try、catch中有return时并没有返回运算之后的值,而是把值保存起来,继续执行finally中的代码,不管finally中对该值有没有做改变,返回的值都不会改变,依然返回保存起来的值。finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值。

3.finally里的语句只有两种情况下,会不被执行。一种是,在try-catch语句之前,程序就结束了或者挂掉了。第二种是遇到System.exit();

a15c98e38864b725720a6acde996ebdc.gif

  • 面试官: 知道WebService吗?

  • 面试官说:说说TCP 和UDP吧!

  • 面试官:多个单列索引和联合索引使用时有什么区别?

  • SpringBoot项目优化和Jvm调优

  • 面试官:你了解对象的分配吗?对象的分配策略,栈上分配与TLAB

  • Mybatis-Plus和Mybatis你了解多少呢?

  • 天天用迭代器和foreach,那它俩到底是怎样工作的呢?

觉得本文对你有帮助?请分享给更多人

关注「互联网技术资源社区」加星标,提升技术栈

如果感觉推送内容不错,不妨右下角点个在看转发朋友圈或收藏,感谢支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值