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

try catch finally 和 return 之间的顺序纠葛

 
阅读更多

 

return语句在try-catch-finally中的执行顺序

 

一般情况下:

public class TryCatchReturn {	

	public static void main(String[] args) {		
		TryCatchReturn tcr = new TryCatchReturn();
		System.out.println("tcr.test(): "+tcr.test());
	}
	
	public int test(){
		int a = 0;
		
		try{
			System.out.println("a: "+a);
			a = 110;
		}catch(Exception e){
			a = a+3;			
		}finally{
			a ++;
			System.out.println("finally a: "+a);
		}
		return a;     
	}	
}

执行结果:

a: 0
finally a: 111
tcr.test(): 111

 

 

1.首先测试3个块的return的优先级

 

public class TryCatchReturn {	

	public static void main(String[] args) {		
		TryCatchReturn tcr = new TryCatchReturn();
		System.out.println("tcr.test(): "+tcr.test());
	}
	
	public int test(){
		int a = 0;
		
		try{
			System.out.println("a: "+a);
			a = 110;
			return a;
		}catch(Exception e){
			a = a+3;
			return a;
			
		}finally{                 //警告: finally block does not complete normally 
			a ++;
			System.out.println("finally a: "+a);
			return a;			
		}
		//return a;                                                //编译报错,不被执行! 
	}	
}

执行结果:

a: 0
finally a: 111
tcr.test(): 111

 

可知test()方法最后是从finally模块的return语句返回的;

 

结论:

1.finally 模块总是会得到执行,且finally模块的return 也总会被执行,而此时try模块的return可以被认为是没有被执行;

2.不推荐在finally模块内return;

 

 

 

2.测试finally块无return时的返回顺序;

public class TryCatchReturn {	

	public static void main(String[] args) {		
		TryCatchReturn tcr = new TryCatchReturn();
		System.out.println("tcr.test(): "+tcr.test());
	}
	
	public int test(){
		int a = 0;
		
		try{
			System.out.println("a: "+a);
			a = 110;
			return a;
		}catch(Exception e){
			a = a+3;
			return a;  
		}finally{
			a ++;
			System.out.println("finally a: "+a);	
		}     
	}	
}

执行结果:

a: 0
finally a: 111
tcr.test(): 110

 

test()方法中,try模块的return语句先于finally模块执行,但return并不立即返回,而是执行后,将把返回结果放置进函数栈中,待finally模块执行完后,又返回至try模块的return语句,退出方法,完成执行。因此,对于此种情况,可以认为try模块的return语句先于finally模块执行,但是方法最终还是从return语句返回退出的。

 

结论:

1. 当try或catch块中有return语句时,finally模块中的语句仍会执行;

2. 当try或catch模块有return语句,若finally模块中无return时,try或catch模块的return返回值在finally模执行前确定的,且return语句先于finally模块执行;

3.当return在try-catch-finally语句之后时,finally模块是在return前执行的;(如首例子所示)

 

3.测试catch模块介入时return的返回顺序(finally无return);

public class TryCatchReturn {	

	public static void main(String[] args) {		
		TryCatchReturn tcr = new TryCatchReturn();
		System.out.println("tcr.test(): "+tcr.test());
	}
	
	public int test(){
		int a = 0;
		
		try{
			System.out.println("a: "+a);
			a = 110;
			throw new Exception();                //try不能return,unreachable
		}catch(Exception e){
			a = a+3;
			return a;			
		}finally{
			a ++;
			System.out.println("finally a: "+a);
		}     
	}	
}

执行结果:

a: 0
finally a: 114
tcr.test(): 113

 

test()是从catch模块的return语句返回,执行过程类似测试2, finally模块是在catch模块的return执行之前才执行的,且catch模块的return返回值在finally模执行前确定的;

 

4.测试catch模块介入时return的返回顺序(finally有return);;

public class TryCatchReturn {	

	public static void main(String[] args) {		
		TryCatchReturn tcr = new TryCatchReturn();
		System.out.println("tcr.test(): "+tcr.test());
	}
	
	public int test(){
		int a = 0;
		
		try{
			System.out.println("a: "+a);
			a = 110;
			throw new Exception();                //try不能return,unreachable
		}catch(Exception e){
			a = a+3;
			return a;			
		}finally{
			a ++;
			System.out.println("finally a: "+a);
                                                return a;		
}     
	}	
}

执行结果:

a: 0
finally a: 114
tcr.test(): 114

 

test()是从finally模块的return语句返回的,catch模块的return可被认为是没有执行,且最终返回的是finally模块a的值;

 

 

 

4.总结

 

 1.无论是否有异常,finally块中的语句都会执行,无论try或catch模块是否有return;

 

2.若finally模块有return,无论try或catch模块中是否有return,程序段最终从finally的return返回;

但一般不推荐在finally语句中return;

 

3. 若finally模块无return,且try或catch模块有return,try或catch模块的return返回值在finally模块执行前就已经确定,然后执行finally模块,且但方法最终从return语句返回;

 

4.对于try-catch-finally语句之后的return语句,finally模块是在return前执行的,且return返回值在finally模执行后确定的;

1
2
分享到:
评论
3 楼 kakajw 2012-08-29  
try模块的return语句先于finally模块执行,但return并不立即返回,而是执行后,将把返回结果放置进函数栈中,待finally模块执行完后,又返回至try模块的return语句,退出方法,完成执行。因此,对于此种情况,可以认为try模块的return语句先于finally模块执行,但是方法最终还是从return语句返回退出的。


castte 写道
3. finally模块是在try或catch模块的return后才执行的,且try或catch模块的return返回值在finally模执行前就已经确定;

前半句不对吧, finally模块应该是在try或catch模块的return前执行的

2 楼 castte 2011-11-25  
3. finally模块是在try或catch模块的return后才执行的,且try或catch模块的return返回值在finally模执行前就已经确定;

前半句不对吧, finally模块应该是在try或catch模块的return前执行的
1 楼 sdujq 2011-02-24  
………………

相关推荐

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

    下面我们来详细讲解 try、catch、finally、return 执行顺序的规则和特点。 首先,我们需要了解 try、catch、finally 语句的基本用法。try 语句用于包装可能抛出异常的代码,catch 语句用于捕捉 try 语句中的异常,...

    try 与 catch finally关键字

    Java的 try 与 catch finally关键字的使用

    使用try-catch-finally处理异常

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

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

    在这个例子中,尽管 `try` 和 `catch` 都有 `return`,但最终的返回值由 `finally` 块的 `return` 决定。`finally` 块总是会被执行,即使在 `try` 或 `catch` 中已经有一个 `return` 语句,这使得我们可以确保无论...

    try_catch_finally异常处理java

    即使`try`或`catch`块中存在`return`语句,`finally`块的代码也会被执行。这确保了程序的整洁和资源的有效管理。 在Java中,`try-catch-finally`结构可以单独使用,也可以嵌套使用。嵌套的`try-catch-finally`允许...

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

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

    try-catch-finally捕获异常

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

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

    Java try catch finally异常处理组合详解 Java try catch finally异常处理组...通过try catch、try catch finally、多个catch和try finally等不同的异常处理方式,可以灵活地处理各种异常,提高程序的健壮性和可靠性。

    17.javatry…catch…finally语句.zip

    17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句...

    Jungle68#-#[Java] try catch finally,try里有return,finally还执行么?1

    Condition 3: try中有异常,try-catch-finally里都没有return ,finally 之后有个returntry中有异常以后,根据

    try-finally-return-in-finally.rar_return

    综上所述,`try-finally` 结构结合`return`语句的使用是一个重要的编程概念,尤其在处理异常和资源释放时。正确理解和应用这一机制可以提高代码的稳定性和可读性。而针对大量嵌套括号的正则表达式,我们需要关注其...

    VB.NET Try Catch Finally用法演示源码.rar

    VB.NET 演示带Finally的Try Catch 异常处理用法...使用Finally的好处是,把资源释放或状态还原的代码放到finally块中,可以保证在try和catch语句执行完后,一定会执行finally语句块,而不用考虑各种复杂的跳转情况。

    try-catch-finally执行顺序验证

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

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

    在这个过程中,函数会将`try`或`catch`块中的`return`语句返回的值暂存起来,然后执行`finally`块。 如果在`finally`块中也有`return`语句,那么这个`return`值会覆盖之前暂存的值。也就是说,最终返回给调用者的值...

    trycatch.zip

    本示例中的"trycatch.zip"文件内容就是展示了如何在Golang中模拟`try...catch`和`try...catch...finally`。 Golang的核心错误处理方式是通过返回错误值。通常,函数会返回一个错误值,如果在执行过程中遇到问题,就...

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

    `try-catch`语句块用于捕获和处理可能出现的异常,确保程序在遇到错误时不会立即终止,而是能够优雅地处理问题并继续执行。当一个`try`块中的代码抛出异常,相应的`catch`块将捕获该异常并执行相应的处理代码。在...

    C#中的try catch finally用法分析

    即使在`try`或`catch`块中有`return`语句,`finally`块的代码也会被执行。 ```csharp finally { // 无论是否发生异常都会执行的代码 } ``` 在示例中,无论`j`的值是否为0,`finally`块的`Console.WriteLine(j....

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

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

    Springboot全局异常捕获及try catch区别解析

    try catch语句通常用于捕获和处理特定的业务逻辑异常,而Springboot全局异常捕获机制则用于捕获和处理应用程序中的所有未捕获的异常,以便提供统一的错误处理机制。 此外,还需要注意的是,try catch语句和...

    关于Java中的try-catch-finally语句和return

     第二:finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的后。可行的做法有四:  1、return语句只在函数后出现一次。  2、return语句仅在try和catch里面都出现。  3、...

Global site tag (gtag.js) - Google Analytics