Java在异常处理中try、catch、finally的执行顺序

    通过学习Java的异常处理,知道它是通过try-catch-finally来实现的,那么就有一个疑问?他们的执行顺序是如何的,接下来我将通过简单的实例来说明。

 


当无异常时的代码:

	try {
			int c = 10/5; 
			System.out.println("没有异常走try");
		}catch(Exception e) {
			System.out.println("有异常走的catch");
		}finally {
			System.out.println("走的finally的内容");
		}

执行结果:

由上述代码及其执行结果可以看出当10/5正常执行因为没有异常所以走的是try块的内容并没有经过catch,但是其仍然走了finally的内容。


 当有异常时的代码:

	try {
			int c = 10/0; 
			System.out.println("没有异常走try");
		}catch(Exception e) {
			System.out.println("有异常走的catch");
		}finally {
			System.out.println("走的finally的内容");
		}

执行结果:

Java在异常处理中try、catch、finally的执行顺序_第1张图片

当我们将分母改为0时它是必然存在异常的,由执行结果可以看出它走了catch的模块,但其仍然经过了finally的内容。

 


总结:

1、首先我们可以看出try、catch、finally的执行顺序,是按顺序执行的,同时不论是否存在异常finally都是要执行的。

2、当try中没有异常时,其执行顺序为try→finally。

3、当try中有异常,其执行顺序为try→catch→finally。


    对知识进一步扩展,当我们添加return时try-catch-finally执行顺序又是如何的呢?接下来仍然用代码和执行结果来说明

当无异常时只存在try-catch的return的代码:

	try{
	
			int c = 10/5; 
			return "没有异常走try";
		}catch(Exception e){
			return "有异常走的catch";

		}

执行结果:

Java在异常处理中try、catch、finally的执行顺序_第2张图片

从执行结果可以看出当没有异常,try块中有return关键字时 ,没有finally 则直接返回


当有异常时只存在try-catch的return的代码:

        try{
	
			int c = 10/0; 
			return "没有异常走try";
		}catch(Exception e){
			return "有异常走的catch";

		}

执行结果:

Java在异常处理中try、catch、finally的执行顺序_第3张图片

从执行结果可以看出当有异常,返回的时catch块的return


当无异常时存在finally的return的代码:

        try{
	
			int c = 10/5; 
			return "没有异常走try";
		}catch(Exception e){
			return "有异常走的catch";

		}finally{
			return "走的finally的内容";
			
		}

执行结果:

Java在异常处理中try、catch、finally的执行顺序_第4张图片

从执行结果可以看出当没有异常,且try和finally中都存在return时返回的是finally的值


当有异常时存在finally的return的代码:

        try{
	
			int c = 10/0; 
			return "没有异常走try";
		}catch(Exception e){
			return "有异常走的catch";

		}finally{
			return "走的finally的内容";
			
		}

执行结果:

Java在异常处理中try、catch、finally的执行顺序_第5张图片

从执行结果可以看出当有异常,且catch和finally中都存在return时仍然返回的是finally的值


总结:

1、try块中有return 关键字, catch块也有return 关键字时且没有finally时,如果有异常时则作走catch块的return,如果没有异常则走try里的return。

2、当try块中有return ,carch也有return,且finally中也有return 如果没有异常发生走finally里的return。

3、当try块中有return,catch也有return,且finally也有return,如果有异常 则按照finally中的返回结果执行。

注意:

1、finally中的代码总会被执行。

2、当finally里存在return时不管是否出现异常都会走finally的异常,这样会破坏程序的完整性,而且一旦finally里出现异常,会导致catch中的异常被覆盖。所以虽然finally可以通过编译与执行,但是在finally书写return是不推荐的。

 

 

 

 

你可能感兴趣的:(java)