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语句的值作为返回,前面的一个被默认的牺牲啦。
*/

Finally语句块的执行

时间: 2024-07-29 02:14:30

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

52.finally语句块不执行的唯一情况

import java.util.Scanner; /** * 使用try-catch-finally进行异常处理. */ public class Test4 { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.print("请输入被除数:"); try { int num1 = in.nextInt(); System.out.print("请

java 抛出异常与finally的混用对于语句块的执行顺序的影响

代码如下: 1 package test1; 2 3 public class EmbededFinally { 4 5 6 public static void main(String args[]) { 7 8 int result; 9 10 try { 11 12 System.out.println("in Level 1"); 13 14 15 try { 16 17 System.out.println("in Level 2"); 18 // res

SQLPLUS执行PL/SQL语句块

1.首先登录Oracle HR schema: 2.对于PL/SQL程序,分号表示语句的结束:而使用 "."  号表示整个语句块的结束,也可以省略.按回车键后,该语句块不会执行,即不会发送到数据库服务器,而是必须使用 "/" 符号执行PL/SQL 语句块 使用 "/" 执行PL/SQL 语句块 3. 在上例中,虽然执行了PL/SQL 程序,但是没有输出结果的显示.数据库服务器肯定将数据传输给了SQLPLUS,并且变量var_first_name

关于 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

static{}语句块详解

static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用. 一.在程序的一次执行过程中,static{}语句块中的内容只被执行一次,看下面的示例: 示例一 [java] view plain copy class Test{ public static int X=100; public final static int Y;=200 public Test(){ System.out.prin

左右 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语句块一定会被执行?

通过阅读JVM规范,得知编译器是通过冗余来实现finally语句块的.我们可以写段代码做一个验证. JDK版本:8 如下面的代码: import java.io.*; public class Main { public static void main(String[] args) { try { foo(); } catch (IOException e) { int a = 100; } catch (Exception e) { int b = 200; } finally { int

Java静态语句块、语句块、构造方法执行顺序

package com.imooc.practice; class Parent{ public Parent(){ System.out.println("Parent构造方法执行!"); } { System.out.println("Parent非静态语句块执行!"); } static{ System.out.println("Parent静态语句块执行!"); } } public class Child extends Parent{

try ,finally都抛出异常如何处理.如果try中抛出了异常,在控制权转移到调用栈上一层代码之前, finally 语句块也会执行,如果finally抛出异常,try语句快抛出的那个异常就

package com.github.jdk7; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * try ,finally都抛出异常如何处理.如果try中抛出了异常,在控制权转移到调用栈上一层代码之前, * finally 语句块也会执行,如果finally抛出异常,try语句快抛出的那个异常就丢失了. * * @author doctor * * @since 2014年