`
wanng
  • 浏览: 68260 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java中try catch finally的执行顺序

    博客分类:
  • java
阅读更多

作者:wasw100
网址:http://www.wasw100.com/java/java_try-catch-finally_order.html

 

直接贴代码

 

 

package com.wasw100.test;

public class CatchTest {
	public static void main(String[] args) {
		System.out.println(test());
	}

	public static String test() {
		int i = 0;
		TestData td = new TestData();
		try {
			i=1;
			td.setS("1");
			System.out.println("try块执行 \ti:"+i+" s:"+td.getS());
			Integer.parseInt("a");
			return "正常返回\ti:"+i+" s:"+td.getS();
		} catch (Exception e) {
			i=2;
			td.setS("2");
			System.out.println("catch块执行\ti:"+i+" s:"+td.getS());
			return "catch块返回\ti:"+i+" s:"+td.getS();
		} finally {
			i=3;
			td.setS("3");
			System.out.println("finally块执行\ti:"+i+" s:"+td.getS());
			// return "finally块返回";
		}
	}
}

class TestData{
	
	private String s;

	public String getS() {
		return s;
	}

	public void setS(String s) {
		this.s = s;
	}
	
}

执行结果:
try块执行 	i:1 s:1
catch块执行	i:2 s:2
finally块执行	i:3 s:3
catch块返回	i:2 s:2

 

执行顺序很好理解,但是返回的i、s的值为什么是2,不是3?

一个很不错的解释:http://www.iteye.com/topic/79092?page=2#284368

总结:

try或者catch执行后,如果有return语句,那么先把返回值copy到栈顶,例如上面的例子会把  "catch块返回\ti:"+i+" s:"+td.getS() 得到的字符串的引用copy到栈顶,也就是说return已经执行,但是还没返回(在MyEclipse的debug模式下可以看的很清楚)  然后执行finally,执行完finally,再把栈顶的值返回。如果返回的是一个对象的引用的话,那么将是finally执行后的值

 

 因为字符串是一个在java中有特殊的对待,所以和普通对象有所不同,字符串是放到字符串常量池的,而换成一个普通对象作为返回值就能够看出来了。

 

java中的字符串可以看http://b0r0j0.blogbus.com/logs/8213193.html

 

--EOF--

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    java try…catch嵌套捕获异常的实例

    在这个结构中,`try`块包含可能会抛出异常的代码,每个`catch`块分别捕获不同类型的异常,`finally`块则包含需要无论发生何种情况都必须执行的代码,如资源清理。 接下来,我们来探讨嵌套的`try-catch`块。当一个`...

    Java try catch finally异常处理组合详解

    Java try catch finally异常处理组合详解 Java try catch finally异常处理组합是Java语言中的异常处理机制,用于捕获和处理程序中的异常。下面对try catch finally异常处理组合进行详细的介绍。 try catch组合: ...

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

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

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

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

    try-catch-finally执行顺序验证

    try-catch-finally执行顺序验证(左边是.java文件,右边是.class文件) 提示: try、catch块内的return操作编译后会变成把return的值保存到变量var的操作。 总结: try、catch块内的return操作编译后会变成把return的值...

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

    需要注意的是,在 finally 中改变 return 的值对返回值没有任何影响,这是因为 finally 中的代码是在 return 前执行的,而 return 语句是在 finally 中执行的。因此,对于基本类型的数据,在 finally 中改变 return ...

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

    例如,在try语句块中执行了System.exit(0)语句,终止了Java虚拟机的运行,finally语句块也不会执行。 下面是一个示例代码Demo2: public class Test { public static void main(String[] args) { System.out....

    try-catch的用法和含义

    `try-catch` 结构作为异常处理的核心机制,在各种编程语言中广泛采用,如 Java、C# 和 JavaScript 等。本文将深入探讨 `try-catch` 的基本概念、语法结构及其应用场景。 #### 一、`try-catch` 的基本概念 `try-...

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

    在这个例子中,无论`try`或`catch`块中的`return`语句如何,`finally`块都会执行,确保文件流被关闭。 总的来说,Java的`finally`语句块确保了关键代码的执行,尤其是在处理异常或资源清理的情况下。理解`finally`...

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

    这意味着,如果在try块中执行了return语句,finally语句将在return语句执行之前执行。如果finally语句中包含了return语句,即使前面的catch块重新抛出了异常,则调用该方法的语句也不会获得catch块重新抛出的异常,...

    浅谈Java中return和finally的问题

    2. **`return` 与 `finally` 的执行顺序**:在 `try` 块中遇到 `return` 时,会先执行 `finally` 语句块,然后再返回值。这是因为 `finally` 中的代码优先级高于 `return`,即使 `return` 已经被触发,`finally` ...

    使用异常处理语句需要注意的几个问题

    1. **不要单独使用 try、catch 或 finally 语句块**:在Java中,`try`语句块用于包含可能抛出异常的代码,`catch`用于捕获并处理特定类型的异常,而`finally`则用于定义无论是否发生异常都要执行的清理代码。...

    浅谈Java finally语句到底是在return之前还是之后执行(必看篇)

    Java 中 finally 语句的执行顺序探讨 在 Java 中,finally 语句的执行顺序是一个常见的探讨话题。很多人都认为 finally 语句一定会被执行,但这是不正确的。在某些情况下,finally 语句可能不会被执行,例如在 try ...

    java finally块执行时机全面分析

    例如,如果`try`或`catch`块中有一个`return`语句,`finally`块将在`return`之前执行,但不会阻止`return`语句的执行。 关于字节码层面的解释,根据《深入Java虚拟机》一书的描述,`finally`块的实现是通过`jsr`...

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

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

    java面试题 谈谈final, finally, finalize的区别

    这里的 `finally` 块是确保即使在 `try` 或 `catch` 中发生异常,`finally` 里的代码也能得到执行,这对于资源管理非常重要,如关闭数据库连接、文件流等。 3. `finalize()` 方法: `finalize()` 是一个特殊的...

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

    - 如果try块中的代码抛出异常,将按顺序检查`catch`块,找到匹配异常类型的`catch`并执行相应的处理代码。执行完`catch`后,`finally`块的代码会执行。 - 如果所有`catch`块都不能匹配抛出的异常,异常会被提交给...

    java异常ppt

    Java通过一套结构化的异常处理机制来管理这些问题,主要包括五个关键字:try、catch、finally、throw和throws。 `try`块包含可能抛出异常的代码,如果在`try`块中发生异常,控制流会立即跳转到匹配的`catch`块。`...

    JAVA经典试题集合

    当i等于1时,会抛出一个Exception并被捕获,然后执行catch块中的代码,输出"2"并返回,因此不会执行finally块和try块后面的语句。当i不等于1时,会执行try块中的正常逻辑,输出"1",然后执行finally块,输出"3",...

Global site tag (gtag.js) - Google Analytics