首页 > 编程语言 >Java中关于try...catch的return规则

Java中关于try...catch的return规则

时间:2023-11-11 15:36:18浏览次数:47  
标签:... Exception return try println finally catch

本部分针对有return 要求的异常捕获和处理,具体的,try...catch语句存在于方法体中。

方法体中的try...catchreturn 总共有四种可能的地方:

try,catch,finally,方法体末尾(try…catch外)。

共存规则

  • finally中的return 和方法return不能同时存在。(显而易见的第一法则!)
  • try中的returncatch中的return 都有的时候,finally中的return可有可无,但是不能有方法return(编译器提示:方法return 不可到达)
  • trycatch中只有一个有return时,finally 中的return和方法return必须有且只能有一个。(否则:缺少return

共存问题还是很好理的。只要保证每种情况都必须有return就行。

ps.IDEA比较牛逼会在一定程度上分析逻辑……比如如果try里头第一句就是throw的话,try里的return也是会报错的。

int i=1;
try {
    throw new Exception();
    return i;
}//这样会报错。
--- --- --- --- ---
int i=1;
try {
    if(i==1) throw new Exception();
    return i;
}//但是这样不会。

执行顺序

规则

  1. try里头抛出异常被捕获后,try中之后的语句是不会被执行的,而是直接跳转到相应的catch
  2. 无论如何finally中的语句都会在方法返回之前被执行。
  3. finally或者方法体末尾有return时,它会覆盖trycatch中的return
  4. return返回的是一个引用,(可以理解为一个物理地址?)所以当只有trycatch中有return时,如果返回的是不可变类型,那么finally中对对象的”修改“实际上是创建了一个新对象,返回的自然是原来的值;如果返回的是可变类型finally中的修改就会对返回值生效。

实例

  1. 懒得打了,跳过。

int i=1;
try{
    throw new Exception();
}catch(Exception e){
    return i;//返回值为1
}finally{
    i++;
    System.out.println(i);//输出为2
}

finally块的递增操作不会影响catch块中的返回值,因为catch块已经执行完毕并返回了值,finally块中的代码只是在方法返回之前执行的。

  1. public static int get0() {
        int i=1;
        try {
            throw new Exception();
        } catch (Exception e) {
            System.out.println("error");
            return i;
        } finally {
            i++;
            System.out.println("i in finally block:" + i);
            return i;//最终返回2
        }
    }
    

    finally中的return覆盖了之前的return

  2. public static String get1() {
        String i = "ok";
        try {
            throw new Exception();
        } catch (Exception e) {
            System.out.println("error");
            return i;//最终返回"ok"
        } finally {
            i += " finally";
            System.out.println("i in finally: " + i);//输出i in finally: ok finally
        }
    }
    
    public static StringBuilder get2() {
        StringBuilder i = new StringBuilder("ok");
        try {
            throw new Exception();
        } catch (Exception e) {
            System.out.println("error");
            return i;//返回ok finally
        } finally {
            i.append(" finally");
            System.out.println("i in finally: " + i);//输出i in finally: ok finally
        }
    }
    

    其中,String(包括get0()中的int)是不可变类型,而StringBuilder是可变类型,因此导致了返回结果的不同。

当然,自己写代码时有事没事不要往finally里面加return,会导致调试复杂化。

标签:...,Exception,return,try,println,finally,catch
From: https://www.cnblogs.com/qiuerOTO/p/17825957.html

相关文章

  • 新建Maven工程没有src/main...目录?
    0.必看:详细的Maven项目介绍1.问题我新建的Maven项目的pom.xml为空,且无法被识别,同时项目目录没有src/main等等2.解决这里设置的JDK版本不对,我选用了JDK19但是我的Maven仓库版本是3.6.1,默认版本应该是1.4,这里使用1.8也能兼容。但是使用JDK19是不兼容的!!!所以这里我重新设置......
  • 无涯教程-批处理 - Deleting from the Registry函数
    通过REGDEL命令从注册表中删除,请注意,为了从注册表中删除值,您需要在系统上具有足够的特权才能执行此操作。REGDELETE命令具有以下变体,在第二个版本中,将删除默认值,而在最后一个版本中,将删除指定键下的所有值。REGDELETE[ROOT\]RegKey/vValueName[/f]REGDELETE[ROOT......
  • 无涯教程-批处理 - Adding to the Registry函数
    通过REGADD命令完成添加到注册表,请注意,为了向注册表添加值,您需要在系统上具有足够的特权才能执行此操作。REGADD命令具有以下变体,在第二个变体中,没有为密钥指定名称,它将为密钥添加名称"(默认)"。REGADD[ROOT\]RegKey/vValueName[/tDataType][/SSeparator][/dData]......
  • Android入门教程之Activity(生命周期,启动...)
    Activity是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。每个Activity都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。Activity1.Activity的使用我们新建的工程中带有......
  • 【视频课】纯新手如何快速掌握深度学习必备的Python基础能力,150分钟助你入门!...
    前言欢迎大家关注有三AI的视频课程系列,我们的视频课程系列共分为5层境界,内容和学习路线图如下:第1层:掌握学习算法必要的预备知识,包括Python编程,深度学习基础,数据使用,框架使用。第2层:掌握CV算法最底层的能力,包括模型设计基础,图像分类,模型分析。第3层:掌握CV算法最核心的方向,包括图像分......
  • 言有三新书出版,《深度学习之图像识别(全彩版)》上市发行,配套超详细的原理讲解与丰富的实
    各位同学,今天有三来发布新书了,名为《深度学习之图像识别:核心算法与实战案例(全彩版)》,本次书籍为我写作并出版的第6本书籍。前言2019年5月份我写作了《深度学习之图像识别:核心技术与案例实战》,迄今已经重印5次,被众多读者所认可。可见如下:言有三新书预售,不贵,有料2019年版(全黑白印刷,正......
  • 专访Ultra Jhakaas 业务主管 Venkat Garapati:一款马拉地语的OTT平台是如何打造的?...
    作者|Krishna翻译、编辑|ArisWang原文链接:https://ottverse.com/interview-venkat-garapati-business-head-ultra-jhakaas/ //  自1982年以来,UltraMediaandEntertainment一直是印度当地著名的娱乐内容提供商,该平台致力于为用户提供海量电影、电视节目、网络剧和其他优......
  • bash: cpan: command not found...
     001、问题cpan没调出来,如下:(base)[root@pc1home]#cpan##未发现命令bash:cpan:commandnotfound... 002、解决方法(base)[root@pc1home]#yum-yinstallperl-CPAN##安装CPAN 003、测试效果(base)[root@pc1home]#cpan  . ......
  • 无涯教程-批处理 - Functions with Return Values函数
    函数可以通过简单地传递变量名称来使用返回值,这些变量名称将在调用函数时保存返回值,如下所示Call:function_namevalue1,value2…valuen使用set命令和tilde(〜)字符以及参数的位置编号在函数中设置返回值。下面的示例演示如何使用返回值调用函数。@echooffSETLOCALCALL......
  • 【Django】使用gunicorn部署,找不到静态文件(admin,swagger...)
    先收集静态文件#settings.py里面需要指定收集的路径STATIC_ROOT与STATIC_URLpythonmanage.pycollectstatic添加识别代码#urls.pypath(r'^static/(?P<path>.*)$',serve,{'document_root':STATIC_ROOT}),......