(附运行结果和截图)关于try{return}finally中都有return 运行结果测试之旅

简介: (附运行结果和截图)关于try{return}finally中都有return 运行结果测试之旅

关于try{return}finally{return},这类的问题,面试中很常见,而且有时候现实码代码中也会碰到,所以乘着今天不是很忙的情况下,我无意中想起了自己还不是非常清楚的try...return和finally...return,看了无数遍理论知识不如自己测试来的实在,

首先复习已有的知识知道:
return 是可以当作终止语句来用的,我们经常用它来跳出当前方法,并返回一个值给调用方法。然后该方法就结束了,不会执行return下面的语句。
finally :无论try语句发生了什么,无论抛出异常还是正常执行。finally语句都会执行。

然后测试效果如下。

初级版测试


首先呢,这两个地方必须得有一个return,否则编译都通不过,如果有人给你的是上面截图这种的,你可以很自信的告诉他,对不起,你的代码编译都通不过。

1、在finally中放return

猜想:这种情况很简单,因为finally语句块里有了return,那么一定返回的是finally中的str,所以运行结果应该是ccc

运行结果:

所以猜想正确。

2、在finally外面放return

猜想:难道这种放的和第一种放的会不一样吗?所以大胆猜想,结果应该还是ccc。

运行结果:

运行结果居然是bbb,是不是很吃惊,what?居然和猜想不一样?当然这时候小编决定debug,看看它是怎么走的,最终发现,当运行到finally里面的str="ccc"的时候,并没有走finally下面的这个return,而是直接到main方法里的

String ff = Test002.ff();

这里了,说明这里执行的是try语句块里的return了,所以这是为什么呢?

赶紧翻看各种文档,网上查资料,

最终你会看到jvm官方文档里有关于try catch finally的说明


不知道大家的英语怎么样,能不能翻译一下

通过有道、百度翻译,大概内容是这样的

如果try语句里有return,那么代码的行为如下:
1.如果有返回值,就把返回值保存到局部变量中
2.执行jsr指令跳到finally语句里执行
3.执行完finally语句后,返回之前保存在局部变量表里的值

所以看到这里,大家应该差不多清楚了吧。


3、去掉try语句块里的return

上面第2种说到是没有走finally下面的这个return 的,如果把try语句块里的return去掉,这时候不管下面的这个return是放在finally里面还是外面,这时候相当于程序运行从上到下,遇到return截止,所以运行结果最终是“ccc”

以上的测试代码,小编放在这里,想要测试的小伙伴们,可以直接测试

public class Test002 {
    public static void main(String[] args) {
        String ff = Test002.ff();
        System.out.println(ff);
    }
    public static String ff(){
        String str = "aaa";
        try {
             str = "bbb";
             return str; 
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            str = "ccc";
            //return str;
        }
        return  str;
    }
}

高级版测试

下面小编就不一一介绍了,相信大家都已经明白了,只不过是将字符串变成++i这种形式

这两种情况和上面的初级版测试字符串的是一样的,所以上面清楚了,这个应该也清楚了


但是当变成 i++的形式之后,你就会发现......


代码放这里了,想测试的小伙伴们,可以拿去测试哦

public class Test002 {
    public static void main(String[] args) {
        int ff = Test002.ff();
        System.out.println(ff);
    }
    public static int ff(){
        int str = 1;
        try {
             str = str++;
             return str;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            str = str++;
            //return str;
        }
        return  str;
    }
}
相关文章
|
1月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
111 1
|
2月前
|
测试技术 Python
自动化测试项目学习笔记(一):unittest简单运行(初始化,清除,设置测试行为)
本文介绍了Python的unittest框架的基础用法,包括测试初始化(setup)、清除(tearDown)函数的使用,以及assertEqual和assertGreaterEqual等断言方法,并展示了如何创建测试用例,强调了测试函数需以test_开头才能被运行。
68 1
自动化测试项目学习笔记(一):unittest简单运行(初始化,清除,设置测试行为)
|
2月前
|
SQL 分布式计算 NoSQL
大数据-170 Elasticsearch 云服务器三节点集群搭建 测试运行
大数据-170 Elasticsearch 云服务器三节点集群搭建 测试运行
50 4
|
4月前
|
Cloud Native 数据处理
项目环境测试问题之当异步任务在运行过程中抛出非预期的异常会导致后果如何解决
项目环境测试问题之当异步任务在运行过程中抛出非预期的异常会导致后果如何解决
|
5月前
|
Java 测试技术 数据库
单元测试问题之LoginServiceImpl以避免对IpUtil的依赖问题如何解决
单元测试问题之LoginServiceImpl以避免对IpUtil的依赖问题如何解决
|
4月前
|
Linux C#
【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application
【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application
|
5月前
|
测试技术 持续交付
单元测试问题之确保单元测试自动化运行中的问题如何解决
单元测试问题之确保单元测试自动化运行中的问题如何解决
|
5月前
|
SQL DataWorks Java
DataWorks操作报错合集之在本地任务和冒烟测试中可以正常运行,但在调度任务中报错,是什么原因
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
5月前
|
测试技术 数据安全/隐私保护 索引
基于SpringBoot+Vue大学生体质测试管理系统【源码+论文+演示视频+包运行成功】(2)
基于SpringBoot+Vue大学生体质测试管理系统【源码+论文+演示视频+包运行成功】
48 0
|
5月前
|
Java 关系型数据库 MySQL
基于SpringBoot+Vue大学生体质测试管理系统【源码+论文+演示视频+包运行成功】(1)
基于SpringBoot+Vue大学生体质测试管理系统【源码+论文+演示视频+包运行成功】
82 0
下一篇
DataWorks