Java异常的try...catch..finally执行顺序

Java进行编程,程序可能出现异常,一般异常的处理模式是  ‘抓抛’模式  对异常处理的时候,常用到try...catch..finally代码块来处理。但是这三个关键字是怎么执行的呢?

 

try 代码块 :正常的业务逻辑,一些数据,逻辑顺序的操作。

catch 代码块: 在处理try代码块时遇到的一些异常,捕获这些异常,并将这些异常返回给调用者,告诉调用者程序哪儿出错了。

finally 代码块:此时代码不健壮,在try...catch代码块里面都不能很好的处理逻辑或者业务流程,此时finally更多的是一个标识作用或者将程序的主控权交给出去

 

一.没有return 关键字

 1.此时程序没有异常 

  try...finally..  不会执行catch代码块里面的代码

程序进入try代码块,不存在异常,执行完try代码块里面代码,然后进入finally代码块。

    public static int  test4() {
          try {
            System.out.println("try代码块执行!!!");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("catch 代码块执行!!!");
        }finally {
            System.out.println("finally 代码块执行!!!");
                
           }
            
        }

执行完控制台打印:

try代码块执行!!!
finally 代码块执行!!!

2.此时程序有异常(存在多个catch代码块)

try...catch..catch.....finally

程序先进入try代码块,因为存在异常,然后进入catch代码块捕获异常,如果存在多个异常,需要多个catch代码块捕获,若捕获成功,打印堆栈信息,最后进入finally代码块

public static void  test4() {
		  try {
			 System.out.println(10/0);
			 System.out.println("try代码块执行!!!");
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("catch 代码块执行!!!");
		}finally {
			System.out.println("finally 代码块执行!!!");
				
		   }
			
		}

控制台打印:

//在try里面  若在出现异常的代码前有正确代码,是可以执行,若在异常代码后,则不会执行

java.lang.ArithmeticException: / by zero
    at edu.ncu.essien.hexceptions.TestExceptions.test4(TestExceptions.java:69)
    at edu.ncu.essien.hexceptions.TestExceptions.main(TestExceptions.java:21)
catch 代码块执行!!!
finally 代码块执行!!!

二   有三个代码块中有return关键字 

 1.若return 关键字在finally代码块中,不管try..catch..代码块中是否存在return关键字,都会返回finally代码块的return值

  

	public static int  test2() {
	  try {
		System.out.println("try代码块执行!!!");
		return 1;
	} catch (Exception e) {
		e.printStackTrace();
		System.out.println("catch 代码块执行!!!");
		return 2;
	}finally {
		System.out.println("finally 代码块执行!!!");
		return 3 ;
			
	   }
		
	}

控制台打印:

try代码块执行!!!
finally 代码块执行!!!
3

①代码不存在异常:

代码先进入try代码块,不存在异常,按道理来说应该在执行完打印语句后,在再去执行 return 1。但是我们知道不论try...catch代码如何执行,finally里面的代码都会被执行,此时程序并没有直接 return 1,而是进入了finally代码块,按顺序去执行finally代码块里面的语句,在遇到return 关键字时,此时执行return语句,return 3将值返回 程序退出。则永远不会执行return1

②代码存在异常

代码先进入try代码块,结果存在异常,此时不会执行try代码块里面异常代码后面的语句,此时 return 1不会被执行。而是进入catch代码块,打印堆栈信息,此时到了return 2 这句话。但是不论try...catch代码如何执行,finally里面的代码都会被执行,此时程序并没有直接 return 2,而是进入了finally代码块,按顺序去执行finally代码块里面的语句,在遇到return 关键字时,此时执行return语句,return 3将值返回 程序退出。不会执行return 2.

 

 2.若return 关键字不在finally代码块中,try..catch..代码块中是存在return关键字,会根据具体代码返回,但是一定会在返回之前执行finally代码块里面的代码

1.关键字return 在try代码块中且程序无异常

public static int test2() {
		int x = 0;
		try {
			System.out.println("try代码块执行!!!");
			x = 1;
			return x;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("catch 代码块执行!!!");

		} finally {
			System.out.println("finally 代码块执行!!!");

		}
		return x;

	}

控制台打印:

try代码块执行!!!
finally 代码块执行!!!
1

程序进入try代码块,不存在异常,则不进入catch代码块,在return之前必须先去执行finally代码块里面的代码,则先打印tyr代码块里面语句,在打印finally里面的代码,然后退出。

2..关键字return 在try代码块中且程序有异常

public static int test2() {
		int x = 0;
		try {
			System.out.println(x/0);
			x = 1;
			System.out.println("try代码块执行!!!");
			return x;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("catch 代码块执行!!!");

		} finally {
			System.out.println("finally 代码块执行!!!");

		}
		return x;

	}

控制台打印:

java.lang.ArithmeticException: / by zero
    at edu.ncu.essien.hexceptions.TestExceptions.test2(TestExceptions.java:54)
    at edu.ncu.essien.hexceptions.TestExceptions.main(TestExceptions.java:20)
catch 代码块执行!!!
finally 代码块执行!!!
0

程序进入try代码块,存在异常,则进入catch代码块,打印堆栈信息,然后执行finally代码块里面的代码,然后根据代码顺序,return初始变量x,然后退出。

 

3..关键字return 在catch代码块中且程序无异常

public static int test2() {
		int x = 0;
		try {
			x = 1;
			System.out.println("try代码块执行!!!");
	
		} catch (Exception e) {
			x = 2 ;
			e.printStackTrace();
			System.out.println("catch 代码块执行!!!");
			return x;

		} finally {
			System.out.println("finally 代码块执行!!!");

		}
		return x;

	}

控制台打印:

try代码块执行!!!
finally 代码块执行!!!
1

程序进入try代码块,不存在异常,则不进入catch代码块,执行try里面的语句,对x赋值,然后再去执行finally里面的语句,然后程序顺序退出。

4..关键字return 在catch代码块中且程序有异常

	public static int test2() {
		int x = 0;
		try {
			System.out.println(x/0);
			x = 1;
			System.out.println("try代码块执行!!!");
	
		} catch (Exception e) {
			x = 2 ;
			e.printStackTrace();
			System.out.println("catch 代码块执行!!!");
			return x;

		} finally {
			System.out.println("finally 代码块执行!!!");

		}
		return x;

	}

控制台打印:

java.lang.ArithmeticException: / by zero
catch 代码块执行!!!
finally 代码块执行!!!

程序进入try代码块,存在异常,则进入catch代码块,打印堆栈信息,在return之前必须先去执行finally代码块里面的代码,则先打印catch代码块里面语句,在打印finally里面的代码,然后退出。

 

你可能感兴趣的:(Java异常的try...catch..finally执行顺序)