java finally中含return语句

《java核心技术卷一》中提到过:当finally子句包含return 语句时(当然在设计原则上是不允许在finally块中抛出异常或者 执行return语句的,我不明白为何java的设计者并没有在语法上禁用这样的形式),将会出现一种意想不到的结果。假设利用return语句从try 语句块中退出。在方法返回前,finally子句的内容将被执行。如果finally子句中也有一个return语句,这个返回值将会覆盖原始的返回值。

但作者没有提及的是,finally中的return语句不仅会覆盖原返回值,还会”吃掉“在catch子句中抛出的异常。测试代码如下:

import java.io.*;

public class ReturnInFinally{
	public static void main(String[] args){
		try{
			boolean i=Test1();
			System.out.println("End of try Test1");
		}catch(Exception ex){
			System.out.println("Catch exception in Main() ");
		}finally{
			System.out.println("Finally in Main() ");
		}

		boolean j=Test2();
		System.out.println("j=" + j);
	}
	private static boolean Test1() throws Exception{
		try{
			throw new Exception("Exception thrown by Test1()");
		}catch(Exception ex){
			System.out.println("Catch exception in Test1() ");
			throw ex;//重新抛出异常
		}finally{
			return true;//抛出的异常被return”吃“掉
		}
	}
	private static boolean Test2(){
		try{
			return false;
		}finally{
			return true;
		}
	}
}

  

运行结果为:

Catch exception in Test1()
End of try Test1
Finally in Main()
j=true

  

  

时间: 2024-10-11 07:32:19

java finally中含return语句的相关文章

【转】case: Java中try catch finally语句中含有return语句的执行情况(总结版)

Java中try catch finally语句中含有return语句的执行情况(总结版) 有一点可以肯定,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了,这也是不建议在finally中return的原因.下面来看这几种情况. 情况一(try中有return,finally中没有return): [java] view plain copy public class TryTest{ public 

Java中try catch finally语句中含有return语句的执行情况

finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了,这也是不建议在finally中return的原因.下面来看这几种情况. 情况一(try中有return,finally中没有return): public class TryTest{ public static void main(String[] args){ System.out.println(test()); } private static

Java中try catch finally语句中含有return语句的执行情况(总结版)

在这里看到了try >但有一点是可以肯定的,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了,这也是不建议在finally中return的原因.下面来看这几种情况. 情况一(try中有return,finally中没有return): public class TryTest { public static void main(String[] args) { System.out.println(t

eclipse黄色警告(finally block does not complete normally) ,不建议在finally中使用return语句

在eclipse中编写如下的代码,eclipse会给出黄色告警:finally block does not complete normally. public class Test { public static void main(String[] args) { System.out.println(m1(null)); } public static String m1(String name) { try { name.length(); } finally { return name

Java - 若try中有return语句,finally会执行吗?在return之前还是之后呢?

会执行,在方法return动作之前,return语句执行之后,若finally中再有return语句,则此方法以finally的return作为最终返回,若finally中无return语句,则此方法以try的return作为最终返回. P:方法的返回值以最后一个执行return语句的运算结果为准,返回值一旦确定,不随之后执行的代码影响. 测试程序: public static void main(String[] args) { System.out.println(test()); Syst

【视频+图文】带你快速掌握Java中含continue语句的双重for循环

双重for循环掌握后,我们就一起来看看双重for循环的进阶内容一之带continue语句的双重for循环. 上期双重for循环[视频+图文]讲解传输门:点击这里可去小乔的哔哩哔哩观看for循环视频~ 带continue语句的双重for循环[视频+图文] continue语句能用在哪?它的作用是什么? 用法:只能用在循环结构中(for循环,while循环,do-while循环,for each循环) 作用:本次循环体中的continue语句之后代码不执行,直接跳到下次循环. 例子:(ps:看到这里

【视频+图文】带你快速掌握Java中含break语句的双重for循环

双重for循环掌握后,我们就一起来看看双重for循环的进阶内容一之带break语句的双重for循环. 双重for循环[视频+图文]讲解传输门:点击这里可去小乔的哔哩哔哩观看~ 带continue语句的双重for循环[视频+图文]讲解传输门:点击这里可去小乔的哔哩哔哩观看~ 带break语句的双重for循环[视频+图文] break语句能用在哪?它的作用是什么?与continue语句的区别是什么? 用法:能用在循环结构中(for循环,while循环,do-while循环,for each循环)和s

关于在Java代码中写Sql语句需要注意的问题

最近做程序,时不时需要自己去手动将sql语句直接写入到Java代码中,写入sql语句时,需要注意几个小问题. 先看我之前写的几句简单的sql语句,自以为没有问题,但是编译直接报错. 1 String str = "insert into XXX(a,b,c) values ('"a.getA()"','"a.getB()"','"a.getC()"');"; 研究了半天发现应该是连接字符串问题,第一次修改过后将赋值字段前后加“

try catch finally语句块中存在return语句时的执行情况剖析

2种场景 (1) try中有return,finally中没有return(注意会改变返回值的情形);(2) try中有return,finally中有return; 场景代码分析(idea亲测) 场景一: 1 //实例一:try中有return,finally中没有return 2 public class TryReturnFinally { 3 public static void main(String[] args) { 4 System.out.println(test()); 5