zoukankan      html  css  js  c++  java
  • 当return遇到try、catch、finally时会发生什么?

    点击上方蓝色链接,关注并“设为星标”

    精彩内容,每天及时推送

    1.return的作用

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

    package com.albertyy.other;/* * 公众号:AlbertYang */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;/* * 微信公众号:AlbertYang */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;/* * 微信公众号:AlbertYang */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();

    正文结束

    推荐阅读

    (点击标题可跳转阅读)

    1.Google 出品的 Java 编码规范,强烈推荐,权威又科学!

    2.在Java中什么时候才要考虑线程安全

    3.代码注释照样可以玩出花来

    4.盲人都能编程,你有什么资格说自己不行

    5.厉害了,淘宝千万并发,14 次架构演进…

    6.装饰器和代理模式的区别,从一碗小米粥谈起

    7.写了 十多年代码的宝贵经验

    8.作为一个程序员,拷问灵魂的时刻到了!

    9.你太菜了,竟然不知道Code Review...

    10.硬核动图让你轻松弄懂递归,查找等概念

    长按二维码识别关注

  • 相关阅读:
    思念
    空白
    curl json string with variable All In One
    virtual scroll list All In One
    corejs & RegExp error All In One
    socket.io All In One
    vue camelCase vs PascalCase vs kebabcase All In One
    element ui 表单校验,非必填字段校验 All In One
    github 定时任务 UTC 时间不准确 bug All In One
    input range & color picker All In One
  • 原文地址:https://www.cnblogs.com/yangxianyang/p/13675577.html
Copyright © 2011-2022 走看看