Java进行编程,程序可能出现异常,一般异常的处理模式是 ‘抓抛’模式 对异常处理的时候,常用到try...catch..finally代码块来处理。但是这三个关键字是怎么执行的呢?
try 代码块 :正常的业务逻辑,一些数据,逻辑顺序的操作。
catch 代码块: 在处理try代码块时遇到的一些异常,捕获这些异常,并将这些异常返回给调用者,告诉调用者程序哪儿出错了。
finally 代码块:此时代码不健壮,在try...catch代码块里面都不能很好的处理逻辑或者业务流程,此时finally更多的是一个标识作用或者将程序的主控权交给出去
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 代码块执行!!!
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 代码块执行!!!
2
程序进入try代码块,存在异常,则进入catch代码块,打印堆栈信息,在return之前必须先去执行finally代码块里面的代码,则先打印catch代码块里面语句,在打印finally里面的代码,然后退出。