`

有关Java异常处理中包含return语句的try和finally执行顺序的实证

    博客分类:
  • Java
阅读更多

         依稀记得finally块的执行顺序是在try块的后面,但是是在try的return语句之前。然后试了一下。

public static void main(String[] args) {
	// TODO Auto-generated method stub
	System.out.println(get());
}

public static boolean get() {

	try {
		System.out.println("try");
		return true;

	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		System.out.println("finally");
	}
	return false;
}

 

果然打印结果为:

try
finally
true

 

        但是上午写代码的时候碰到个情况,try语句中最后要return一个值,return语句里面引用到一个对象,但是要在finally中清理掉这个对象,心想这要是按照上面的执行顺序,岂不是在return的时候就会报空指针的错误了,于是尝试了一下。

 

class C {
	int c = 100;

	int get() {
		return c;
	}
}

 

public static void main(String[] args) {
	// TODO Auto-generated method stub
	System.out.println(get());
}

public static boolean get() {
	C c = null;
	try {
		c = new C();
		System.out.println("try");
		return (c.get() == 100);
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		c = null;
		System.out.println(c);
		System.out.println("finally");
	}
	return false;
}

 

发现打印结果为:

try
null
finally
true

 

       可见finally确实在try块之后,try中return之前执行了,并且将对象变成null,但是貌似并没有影响try块中return语句的执行结果。表面上貌似跟上面第一个测试的结果相悖了。于是猜想是不是return语句执行结束之后,把执行的结果存放在某个地方了,等到finally执行完毕再把值取出,return出来。

 

       于是重新尝试在finally中return值

public static void main(String[] args) {
	// TODO Auto-generated method stub
	System.out.println(get());
}

public static boolean get() {
	C c = null;
	try {
		c = new C();
		System.out.println("try");
		return (c.get() == 100);
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		c = null;
		System.out.println(c);
		System.out.println("finally");
		return false;
	}
//		return false;
}

 

执行结果为

try
null
finally
false

        因为finally中的return语句,替换掉了在try中return保存的值。

        所以在finally中把对象进行销毁,是不用担心try中return语句的执行结果,因为这个结果在开始执行finally之前就已经保存下来了,只是在finally执行完毕之后重新取出之前保存的值,再return出来

 

0
4
分享到:
评论
3 楼 huyangwin 2013-02-19  
1v1_问天 写道
做这个测试有什么意义吗?

我是初学者,之前自己不太明确这个执行的方式,所以试了一下,算是给自己补一下基础吧~写出来也算是加深点印象
2 楼 1v1_问天 2013-02-18  
做这个测试有什么意义吗?
1 楼 tongsh6 2013-02-18  

相关推荐

    java 中finally语句块与return的执行关系

    在 Java 规范中规定,在 try-catch-finally 中,如果 try-finally 或者 catch-finally 中都有 return,则两个 return 语句都执行,并且最终返回到调用者那里的是 finally 中 return 的值;而如果 finally 中没有 ...

    try、catch、finally、return 执行顺序.doc

    try、catch、finally、return 执行顺序是 Java 编程语言中的一种 exception 处理机制,用于处理程序中的异常情况。下面我们来详细讲解 try、catch、finally、return 执行顺序的规则和特点。 首先,我们需要了解 try...

    try_catch_finally异常处理java

    本文将深入探讨Java中的`try-catch-finally`语句块,以及它们在异常处理中的作用。 首先,`try`块是异常处理的起点。在这个代码段中,我们通常会放置可能会抛出异常的代码。当Java执行到可能抛出异常的代码行时,...

    关于Java中try finally return语句的执行顺序浅析

    关于Java中try finally return语句的执行顺序浅析是Java语言中一个重要的知识点,今天我们来探讨一下try finally return语句的执行顺序。 首先,需要了解的是finally语句块是否一定会执行的问题。很多人第一反应是...

    Java finally语句到底是在return之前还是之后执行?

    在Java编程语言中,`finally`语句块是一个非常关键的结构,用于确保特定代码无论在任何情况下(包括异常发生或正常返回)都会被执行。这个特性使得`finally`成为处理资源清理,如关闭文件流、数据库连接等操作的理想...

    使用try-catch-finally处理异常

    即使在`try`或`catch`块中有return语句,`finally`块的代码也会被执行。 5. **多层嵌套** 你还可以在`try-catch-finally`结构内部嵌套另一个`try-catch-finally`结构,以处理更复杂的情况。这种方式使得异常处理...

    try-catch-finally捕获异常

    try-catch-finally语句是Java语言中一种常用的异常处理机制,当程序在执行过程中出现异常时,可以使用try-catch-finally语句来捕获和处理异常。下面将详细介绍try-catch-finally语句的使用方法和注意事项。 一、try...

    Java异常处理中同时有finally和return语句的执行问题

    总的来说,Java异常处理中的`finally`块设计用于确保关键操作的执行,而`return`语句用于返回方法的值或结束方法执行。当两者同时存在时,`finally`块的代码总是先执行,但最终的返回值由最后遇到的`return`语句决定...

    try-finally-return-in-finally.rar_return

    在编程语言中,`try-finally` 结构是用来确保一段代码在任何情况下(无论是正常执行还是抛出异常)都会被执行的语句块。这个结构在处理资源管理,比如文件流关闭或者网络连接断开等场景时特别有用。当我们谈论`...

    JAVA中异常处理的WORD文档

    在这个结构中,`try`块包含可能抛出异常的代码,`catch`块捕获并处理特定类型的异常,`finally`块确保在任何情况下都会执行,如关闭文件流或释放资源。 3. 异常处理流程 当一个异常发生时,Java会创建一个异常对象...

    实验五 Java异常处理实验.docx

    Java 异常处理是 Java 语言中的一种错误处理机制,用于捕获和处理程序执行过程中出现的异常情况。异常是指程序执行过程中出现的非正常情况,例如除零错误、数组下标越界等。 实验目的 本实验的目的是让学生熟悉 ...

    Java中return语句.pdf

    return 语句是 Java 编程语言中的一种基本语句,用于结束方法的执行并返回指定类型的值。下面是对 return 语句的详细解释。 return 语句的作用 return 语句的主要作用是结束当前方法的执行,并将指定类型的值返回...

    try-catch-finally-return-in-finally.rar_return

    `finally` 块总是会被执行,即使在 `try` 或 `catch` 中已经有一个 `return` 语句,这使得我们可以确保无论发生什么情况,都能执行必要的清理工作并返回一致的结果。 通过分析 `12.5-1.js` 和 `try-catch-finally-...

    java面试题之try中含return语句时代码的执行顺序详解

    Java中的`try-catch-finally`结构是用来处理异常和确保某些代码无论是否发生异常都能被执行的关键部分。在涉及`return`语句时,其执行顺序可能会引起混淆,尤其是在`finally`块中有操作的情况下。让我们深入探讨一下...

    Java异常处理-异常处理的方式1

    在Java中,异常处理主要通过两种方式实现:捕获异常(try-catch-finally)和声明异常(throws + 异常类型)。本篇文章将详细介绍第一种方式——捕获异常。 异常处理的抓抛模型是Java异常处理的核心概念。当程序执行...

    Java异常处理的方法和几个例子源码.rar

    Java异常处理是编程中至关重要的一个环节,它用于在程序执行过程中处理错误和不正常的情况。这个压缩包“Java异常处理的方法和几个例子源码.rar”包含了一些示例代码,帮助开发者深入理解Java中的异常处理机制。下面...

    try catch finally的执行顺序深入分析

    在Java、C#、JavaScript等语言中,`try-catch-finally`结构是异常处理的基础。这个结构的执行顺序是固定的,下面我们将深入分析其工作原理。 首先,程序会尝试执行`try`块中的代码。`try`块的作用是包含可能抛出...

    Java中finally和return的关系实例解析

    在Java中,finally语句可以与return语句结合使用,但是它们的执行顺序是非常重要的。finally语句是在try的return语句执行之后,return返回之前执行的。这意味着,如果在try块中执行了return语句,finally语句将在...

    try~catch~finally中关于return的问题

    在Java的异常机制中,如果finally中含有return语句,则try和catch中的return语句将会被JVM忽视

    高效java异常处理机制

    即使在try或catch中有return语句,finally块也会被执行。 10. **记录异常信息** 在处理异常时,应该记录详细的异常信息,包括堆栈跟踪,这对于定位和解决问题至关重要。 11. **避免在finally块中抛出异常** ...

Global site tag (gtag.js) - Google Analytics