Java:简述try-catch-finally中return返回

2023-11-14

Java:简述try-catch-finally中return返回


  1. Java:详解Java中的异常(Error与Exception)
  2. Java:简述Java中的自定义异常
  3. Java:简述throw-throws异常抛出
  4. Java:简述try-catch-finally异常捕获
  5. Java:简述try-catch-finally中return返回

提示:阅读本文章之前可以先阅读《Java:简述try-catch-finally异常捕获

java中的 finally关键字通常与 try/catch块一起使用。用来在方法结束前或发生异常时做一些资源释放的操作。虽然看起来很简单,在日常开发中也发现关于 finllay还是有些需要注意的地方。

一 . finally 语句块一定会执行吗?

很多人都认为 finally语句块是肯定要执行的,比如下面的代码,只要进入了 try/catch块,不管有没有异常,都会执行 finllay块。

public static void main(String[] args) {
	System.out.println(test());
}
	
public static int test(){
	try {
		System.out.println("try block");
            
        int i = 1 / 0;
        return 0;
	} finally {
		System.out.println("finally block");
	}
}

运行代码输出 :

try block
finally block
Exception in thread "main" java.lang.ArithmeticException: / by zero

但是答案是否定的,我们先来看下面这个例子:

public static void main(String[] args) {
	System.out.println(test());
}
	
public static int test(){
	try {
		System.out.println("try block");
		
		System.exit(0);
		return 0;
	} finally {
		System.out.println("finally block");
	}
}

运行代码输出 :

try block

我们在 try语句块中执行了 System.exit (0)语句,终止了 Java 虚拟机的运行, finally语句块就没有执行。

其实,在下述4种特殊情况时,finally块都不会被执行:
      1)在finally语句块中发生了异常。
      2)在前面的代码中用了System.exit()退出程序。
      3)程序所在的线程死亡。
      4)关闭CPU。

二 . 如果执行了finally,函数返回值问题


我们先来看下面这个例子:

public static void main(String[] args) {
	System.out.println(test());
}
	
public static int test(){
	try {
		System.out.println("try block");
	
		int i = 1 / 0; 
		return 0;
	} catch (Exception e) {
		System.out.println("catch block");
		return 1;
	} finally {
		System.out.println("finally block");
		return 2;
	}
}

运行代码输出 :

try block
catch block
finally block
2

对于上面的代码,相信大部分人都能知道输出值是 2,打印结果也确实是 2,就算把 int i = 1 / 0这一行注释掉,打印结果也是 2。

所以在这里我们可以下结论 : finally里的 return语句会把 try/catch块里的 return语句效果给覆盖掉。

假如我们不在 finally中 return,结果会怎样?我们再看看下面的例子 :

public static void main(String[] args) {
	System.out.println(test());
}
	
public static int test(){
	int i = 999;
	try {
		System.out.println("try block");
		
		i = 1 / 0;
		return i;
	} catch (Exception e) {
		System.out.println("catch block");
		
		i = 100;
		return i;
	} finally {
		System.out.println("finally block");
		
		i = 200;
	}
}

打印结果是 :

try block
catch block
finally block
100

虽然调用了 finllay改变了i的值,但是最后输出还是 100,为什么呢?

对于这种情况我的理解就是在 return的时候会把返回值压入栈,并把返回值赋值给栈中的局部变量, 最后把栈顶的变量值作为函数返回值。所以在 finally中的返回值就会覆盖 try/catch中的返回值,如果 finally中不执行 return语句,在 finally中修改返回变量的值,不会影响返回结果。下图为字节码文件中的部分内容:
在这里插入图片描述

参考:https://mp.weixin.qq.com/s/FzVAXjk7Oj4ycLRH1nKQ1w

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java:简述try-catch-finally中return返回 的相关文章

  • std::cout 有返回值吗?

    我很好奇 std cout 是否有返回值 因为当我这样做时 cout lt lt cout lt lt 打印一些十六进制代码 这个打印值的含义是什么 因为操作数为cout lt lt cout是用户定义的类型 表达式实际上是函数调用 编译器
  • 为什么当函数末尾缺少 return 语句时它会起作用? [复制]

    这个问题在这里已经有答案了 我正在学习C 下面的代码让我困惑 int test return int a for int i 40 i lt 44 i if i a cout lt lt return here with i lt lt i
  • 使用黎曼和进行数值积分 (Python)

    我有以下代码 但是当它运行时 它给出0 0它应该返回一个值2因为我正在尝试整合sin x 在区间内 0 pi 请指教 from math import sin pi def Rsum a b for i in range 1001 s 0
  • 在我自己的 vba 函数中获得没有 gosub 的返回

    我已经与 vba 斗争了一段时间 令人惊讶的是它并没有变得更好 我编写了以下代码 以便我可以为对象使用特殊的比较运算符 Public Function myEquals v As CCtypestore As Boolean If v Is
  • 当返回对象的函数在没有 return 语句的情况下结束时会发生什么

    在 C 中 当应该返回对象的函数在没有 return 语句的情况下结束时会发生什么 返回什么 e g std string func 返回什么 我们不知道 根据标准 该行为是未定义的 6 6 3 2 返回语句 stmt return htt
  • 为什么我的 java 程序在编译时出现“找不到符号”错误?

    我试图在代码末尾返回布尔变量 localFound 的值 但是当我编译时 我收到一条错误 指出它找不到该符号 我知道这是一个处理变量范围的错误 但我不知道如何修复它 如何让我的程序返回正确的值 谢谢 public static boolea
  • 从 python 中的 for 循环返回值

    我试图找出在 for 循环语法中将参数从一个列表或字典传递到另一个列表或字典的语法 我正在寻找的期望结果是这样的 for bean in beans if bean type coffee print bean 只是 我不想打印到标准输出
  • 在 C++ 中是否有通过引用返回新对象实例的正确方法?

    所以我正在编写一些代码 我有这样的代码 class Box private float x y w h public Rectangle GetRect void const return Rectangle x y w h 然后在一些代码
  • 如何使用函数创建二维数组?

    我正在尝试定义一个二维数组 但我想在函数中执行它 这是我的代码 int createArray int columns int rows int array rows for int i 0 i lt rows i array i new
  • 如何使用 isalnum、isdigit、isupper 来测试字符串的每个字符? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试制作一个密码强度模拟器 它要求用户输入密码 然后返回分数 我在用 islanum isdigit isupper 尝试看看输入的
  • 为什么在函数堆栈上返回值不安全

    我在阅读 bruce eckel 时遇到了以下段落 他试图解释为什么函数在堆栈上返回值不安全 现在想象一下如果一个普通函数尝试在堆栈上返回值会发生什么您不能触及返回地址上方堆栈的任何部分 因此该函数必须将值推入返回地址下方 但是当执行汇编语
  • 使用 forEach() 返回数组值[重复]

    这个问题在这里已经有答案了 我希望返回存储在另一个对象中的数组的名称值 exports send function req res req body items forEach function item console log item
  • 如何在C++中“返回一个对象”?

    我知道这个标题听起来很熟悉 因为有很多类似的问题 但我要求问题的不同方面 我知道将东西放在堆栈上和将它们放在堆上之间的区别 在Java中我总是可以返回对 本地 对象的引用 public Thing calculateThing Thing
  • 函数返回与不返回?

    返回还是不返回 是函数的问题 或者说 这真的很重要吗 故事就这样开始了 我曾经编写如下代码 Type3 myFunc Type1 input1 Type2 input2 但最近我的项目学院告诉我 我应该尽可能避免编写这样的函数 并建议采用以
  • 函数 while 循环中的 return 是如何处理的?

    我有一个函数 该函数内部有一个 while 循环 当我尝试使用 IF 语句在 while 循环内设置非局部变量 然后退出整个函数时 突然该变量不再设置 function EXAMPLE cat test txt while read LIN
  • 新的 C++ 返回语法是否受到限制?

    我开始了一个新的私人项目并决定使用更多C 11 https en wikipedia org wiki C 2B 2B11 14 https en wikipedia org wiki C 2B 2B14这次 所以我也开始使用新的返回语法
  • 从 UIViewController 返回 NSString

    我想返回一个NSString 从一个名为InputUIViewController的UIViewController 到之前的一个名为CallerUIViewController的UIViewController 它启动了InputUIVi
  • 从 jQuery.get 嵌套函数中获取 var

    function getUserHours tyPe tarGet get activities search type tyPe function data var hourResultData jQuery parseJSON data
  • PowerShell函数不会返回对象

    我有一个简单的函数来创建一个通用列表 function test genericType Type System Collections Generic List 1 type typedParameters System String c
  • java中初始化并返回一个字节数组

    在我的代码中 我必须将一个 bye 数组 byte temp null 传递给 函数在其内部分配并填充数据 后 从函数返回它仍然为空 我怎样才能找到一个 解决这个问题 请帮我 byte temp null ret foo temp bool

随机推荐