Java中try-finally块的执行顺序

标签: java基础面试 try-finally块 finally块执行顺序
8人阅读 评论(0) 收藏 举报
分类:

本文主要介绍的关于异常处理的时候try-catch-finally块的执行顺序,一般情况下,finally块是会执行,但是有几种情况是不执行的(来源于https://blog.csdn.net/loongshawn/article/details/50489706):

        1). return语句在try之前,还没执行就返回了,当然不执行。 

        2). try语句中用了system.exit(0)强制退出JVM,暴力退出当然也不会执行。

其次为什么要介绍这一部分,首先重要的一点是,在很多面试题目中,会出现这样的题目,其次,理解掌握try-catch-finally块也有助于我们对异常处理的理解。

首先来看一段简单的代码(某公司的面试题)

public class TestFinally2 {

	static String s="";
	public static void main(String[] args) {
		s=test();
		System.out.println("最终结果:"+s);
		
	}
	private static String test() {
		// TODO Auto-generated method stub
	
		try {
			s="a";
			System.out.println("try!");
			return s;//放入栈中,没有直接返回
		} finally {
			System.out.println("come finnal...");
			s="b";
			System.out.println("s:"+s);
		
		}
	}
}

运行结果:看到运行结果是不是很惊讶呢,最终结果为什么不是b呢?


原因:try-finally块中try有return语句,但是执行完毕之后没有立即返回,因为要执行finally块,try中的return结果会放在类似一个队列中,之后如果finally中有return语句,则会把finally中的return语句中的结果放入队列中,最终的是队列中的第一个数据,即finally中return的结果。如果finally中没有return语句,不管怎么改变变量,返回结果还是try块改变的值。比如上面那道题,在try块中s为a,在finally中s为b,但是finally没有return,所以最终结果就是a。

总结:

finally语句在try和catch语句中的return执行后、返回前执行;
若finally语句中没有return,则其执行结果不影响try和catch中已确定的返回值;

若finally语句中有return,则其执行后的结果会直接返回

根据了上面的结论和理解,我们在看一道题:

public class TestFinally {

	public static void main(String[] args) {
		System.out.println(new TestFinally().test());
	}
	
	int test(){
		try{
			return func1();
			
		}
		finally{
			return func2();
		}
	}
	
	int func1(){
		System.out.println("func1");
		return 1;
	}
	int func2(){
		System.out.println("func2");
		return 2;
	}
}

运行结果:


想必根据我的结论应该可以容易得出吧!try块与finally块中都有return,所以最终返回结果就是finally中的return结果。


查看评论

组合语言之艺术3

 第二章    准备工作 第一节  系统一、系统之选择    只因真正了解电脑的人太少,迷信名气的结果,使得 IBM PC/AT占有了市场。为求电脑普及应用,我们唯有因陋就简,针对 IBM PC/AT...
  • dot99
  • dot99
  • 2001-08-04 22:19:00
  • 1334

Java中初始块的执行顺序

在Java中除了使用构造器类对单个对象进行初始化操作外,我们还可以通过初始化块来实现。在一个类中可以有多个初始化块,相同类型的初始化块之间有顺序:前面定义的初始化块先执行,后面定义的初始化块后执行。使...
  • u010695218
  • u010695218
  • 2015-03-12 18:59:04
  • 1032

一道Java笔试题:静态语句块、构造语句块和构造函数的执行顺序

public class HelloA { //构造方法 public HelloA(){ System.out.println("Hello A!父类构造方法"); } //非静态代码块...
  • qq_21856521
  • qq_21856521
  • 2016-11-03 23:13:16
  • 1333

java类运行以及static块的执行顺序

一、java类的static块什么时候执行 如果了解JVM原理,我们可以知道,一个类的运行分为以下步骤: 1、装载;2、链接;3、初始化;4、初始化;5,实例化(创建新的实例) 实际上,stat...
  • Love_JavaProgram
  • Love_JavaProgram
  • 2012-02-22 10:28:35
  • 950

java关于代码块 , 动态代码块 , 静态代码块 , 静态方法 , 构造函数的执行顺序

package com.lanou.Test; public class Static_Main { public static void main(String[] args) { ...
  • xc164725
  • xc164725
  • 2017-08-26 10:22:18
  • 665

Java中finally语句块的深度解析(try catch finally的执行顺序)

首先摆出结论: 1、除了以下2种情况外,不管有木有出现异常,finally块中代码都会执行; ①程序未进入try{}块的执行,如在try之前出现运行时异常,程序终止。 ②程序进入到try{}和c...
  • u014475796
  • u014475796
  • 2016-11-08 22:25:10
  • 1012

java static块和非static块的执行顺序

package test;public class Parent { public Parent(){ System.out.println("constructor in pa...
  • guohan_solft
  • guohan_solft
  • 2017-06-21 10:08:55
  • 124

java中静态块,静态方法,非静态方法,构造方法执行的顺序

叙述:为了充分说明静态块,静态方法,构造方法,普通方法的执行顺序看下面的例子: package test; /** * * 含有继承时,各种发法(静态块,静态方法,构造方法,普通方法)的执行...
  • lurao
  • lurao
  • 2016-04-23 13:22:15
  • 5253

static 块以及代码块执行顺序

static块,普通代码块,构造代码块执行顺序
  • u013238950
  • u013238950
  • 2016-03-16 16:17:03
  • 3264

Java静态代码块、构造代码块、构造方法的执行顺序

Java静态代码块、构造代码块、构造方法的执行顺序静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成...
  • kingzone_2008
  • kingzone_2008
  • 2015-04-12 22:55:22
  • 21512
    个人资料
    持之以恒
    等级:
    访问量: 7474
    积分: 507
    排名: 10万+