通过学习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的内容");
}
当我们将分母改为0时它是必然存在异常的,由执行结果可以看出它走了catch的模块,但其仍然经过了finally的内容。
1、首先我们可以看出try、catch、finally的执行顺序,是按顺序执行的,同时不论是否存在异常finally都是要执行的。
2、当try中没有异常时,其执行顺序为try→finally。
3、当try中有异常,其执行顺序为try→catch→finally。
对知识进一步扩展,当我们添加return时try-catch-finally执行顺序又是如何的呢?接下来仍然用代码和执行结果来说明
try{
int c = 10/5;
return "没有异常走try";
}catch(Exception e){
return "有异常走的catch";
}
从执行结果可以看出当没有异常,try块中有return关键字时 ,没有finally 则直接返回
try{
int c = 10/0;
return "没有异常走try";
}catch(Exception e){
return "有异常走的catch";
}
从执行结果可以看出当有异常,返回的时catch块的return
try{
int c = 10/5;
return "没有异常走try";
}catch(Exception e){
return "有异常走的catch";
}finally{
return "走的finally的内容";
}
从执行结果可以看出当没有异常,且try和finally中都存在return时返回的是finally的值
try{
int c = 10/0;
return "没有异常走try";
}catch(Exception e){
return "有异常走的catch";
}finally{
return "走的finally的内容";
}
从执行结果可以看出当有异常,且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是不推荐的。