Finally语句块的运行

一、finally语句块是否一定运行?

Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被运行?非常多人都说不是。当然他们的回答是正确的,经过试验。至少下面有两种情况下finally语句是不会被运行的:

(1)异常捕获机制finally块与try和catch块是关联的。既然是关联的假设try...catch...finally语句逻辑上达不到没有被运行,如在try语句之前就返回了,这样finally语句就不会运行,这也说明了finally语句被运行的必要而非充分条件是:对应的try...catch...finally语句一定被运行到。

(2)在try块中有System.exit(0);这种语句,System.exit(0);是终止Java虚拟机JVM的。连JVM都停止了。所以都结束了,当然finally语句也不会被运行到。

二、finally语句块是否一定会运行,遇到return怎么办?

public class FinallyTest1 {

	public void  test(){
		try{
			System.out.println("Try statement block……");
			return ;
		}catch(Exception e){
			System.out.println("Exception statement block……");
		}finally{
			System.out.println("在try语句块中return你再强大,也影响不了我finally语句块的继续运行,嘿嘿……");
		}

	}

	public static void main(String[] args) {
		FinallyTest1 t=new FinallyTest1();
		t.test();
	}
}

/*
 运行结果:
	 Try statement block……
	  在try语句块中return你再强大,也影响不了我finally语句块的继续运行,嘿嘿……

总结:
	 finally语句块的运行不会受到try语句块中的return的影响。

*/

三、finally语句块不受return语句的影响。哪finally语句块究竟是在return之前还是之后运行?

public class FinallyTest2 {
	private int test(){
		int a=520;
		try{
			return a+=1314000;
		}catch(Exception e){
			System.out.println();
		}finally{
			System.out.println("Finally运行,a值为:"+a);
			a=0;
			System.out.println("小闹了一下(a=0),嘿嘿!

");
		}

		return 250;
	}

	public static void main(String[] args) {
		FinallyTest2 t=new FinallyTest2();
		System.out.println("方法返回(return) :"+t.test());
	}

}
/*
运行结果:
 	Finally运行,a值为:1314520
	小闹一下(a=0),嘿嘿。
	方法返回(return) :1314520

总结:
	在try语句块中运行到了return时,并非马上返回而是把return要返回的值计算出来先保存到内存中,
	然后去运行finally语句块。然后再返回之前保存要return的值。

*/

四、在返回之前运行在finally块中的语句,哪finally块中也return会怎么样呢?

public class FinallyTest3 {
	//@SuppressWarnings 批注同意您选择性地取消特定代码段(即,类或方法)中的警告。
	@SuppressWarnings("finally")
	private int test(){
		try{
			return 520;
		}catch(Exception e){
			System.out.println();
		}finally{
			return 5820;	//此处return语句会产生警告
		}
	}

	public static void main(String[] args) {
		FinallyTest3 t=new FinallyTest3();
		System.out.println("方法返回(return) :"+t.test());
	}
}
/*
执行结果:
 	方法返回(return) :5820

总结:
	假设try和finally都有return 语句。则返回值以最后一个return语句的值作为返回,前面的一个被默认的牺牲啦。
*/
时间: 2024-12-24 22:00:47

Finally语句块的运行的相关文章

左右 Java 于 finally 深度分析语句块

首先,让我们来问你一个问题:finally 声明块将运行? 很多人认为 finally 语句块是一定要运行.其中还包括了一些非常有经验的 Java 程序猿.不幸的是,没有像很多像人们想象,对于这个问题,当然,答案是否定的,让我们来看看这个样品之后. 清点1 public class Test { public static void main(String[] args) { System.out.println("return value of test(): " + test())

关于 Java 中 finally 语句块的深度辨析

可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机.接下来我就带您一步一步的揭开这个 finally 的神秘面纱. 问题分析 首先来问大家一个问题:finally 语句块一定会执行吗? 很多人都认为 finally 语句块是肯定要执行的,其中也包括一些很有经验的 Java 程序员.可惜并不像大多人所认为的那样,对于这个问题,答案当然是否定的,我们先来看下面这个例子. 清单 1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1

C++学习之路: try&catch 语句块处理异常

#include <iostream> #include <string> #include <vector> #include <stdexcept> using namespace std; //对于不同的异常可以采取不同的catch块进行捕捉 int main(int argc, const char *argv[]) { try { int i; cin >> i; if(i == 0) throw runtime_error("

php 语句块耗时性能测试

$t= microtime(true);        .............................        echo microtime(true) - $t; 1查看从入口文件到页面最终响应用多长时间,使用microtime(),比如测试ci: $t= microtime(true); require_once BASEPATH.'core/CodeIgniter'.EXT; echo microtime(true)- $t; 2查看框架运行默认加载的文件数量: get_

.NET基础 一步步 一幕幕[循环、逻辑语句块]

循环.逻辑语句块   好久不写博客了,断更了好几天了,从上周五到今天,从北京到上海,跨越了1213.0公里,从一个熟悉的城市到陌生的城市,还好本人适应力比较好,还有感谢小伙伴的接风咯,一切都不是事,好了,进入正题: 本篇还是.NET 基础部分咯,主要简述循环,判断: 循环: for循环 语法: for(表达式1;表达式2;表达式3) { 循环体; } 表达式1一般为声明循环变量,记录循环的次数(int i=0;) 表达式2一般为循环条件(i<10) 表达式3一般为改变循环条件的代码,使循环条件终

java synchronized静态同步方法与非静态同步方法,同步语句块

摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方法,也可以选择同步块,这两种方式各有优缺点,至于具体选择什么方式,就见仁见智了,同步块不仅可以更加精确的控制对象锁,也就是控制锁的作用域,何谓锁的作用域?锁的作用域就是从锁被获取到其被释放的时间.而且可以选择要获取哪个对象的对象锁.但是如果在使用同步块机制时,如果使用过多的锁也会容易引起死锁问题,同

catch、finally语句块输出顺序

public class Test { public int add(int a, int b) { try { return a / b; } catch (Exception e) { System.out.println("catch语句块"); } finally { System.out.println("finally语句块"); } return 0; } public static void main(String[] args) { Test te

Finally语句块的执行

一.finally语句块是否一定执行? Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过试验验,至少以下有两种情况下finally语句是不会被执行的: (1).异常捕获机制finally块与try和catch块是关联的,既然是关联的如果try...catch...finally语句逻辑上达不到没有被 执行,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语

zbb20170601 oracle PL/SQL 语句块 游标 自定义游标 异常处理EXCEPTION

--打开日志输出 set serverout on -- PL/SQL 语句块: -- 声明部分 declare v_i number; v_sum number:=0; -- 执行部分 begin v_i := 1; -- 简单loop循环 loop v_sum:=v_sum+v_i; v_i:=v_i+1; if v_i>100 then exit;-- 跳出循环 end if; end loop; dbms_output.put_line(v_sum); -- 异常处理部分 end; --