try catch finally
通常这个语句块的执行是为了处理受检异常,所谓的受检异常就是编译器检测到的并且开发人员必须处理的异常,常见的受检异常有:
Java.lang.ClassNotFoundException
Java.lang.CloneNotSupportedException
Java.lang.IllegalAccessException
Java.lang.InterruptedException
Java.lang.NoSuchFieldException
Java.lang.NoSuchMetodException
在 try 语句块或者 catch 语句块中执行了return之后,finally 语句块还是会正常执行吗?
finally 语句块是会继续执行的;
在 try 语句块中写 return 语句是没有必要的,因为是为了捕捉异常才写的 try 语句块,这样做没有必要;
@Test
public void testTry() {
try {
return;
}catch (Exception e) {
return;
} finally {
System.out.println("finally will be executed!");
}
}
finally 语句块中的代码是可以正常执行的
在 finally 语句块中执行 return 之后程序还会继续执行吗?
return 在 finally 语句块最前面
在 finally 语句块的执行之前直接 return 后面的语句是不会编译通过的,编译器直接报错,不是异常,是错误的做法;
@Test
public void testTry() {
try {
return;
}catch (Exception e) {
return;
} finally {
return;
System.out.println("finally will be executed!");// 这句话会爆红,不允许这样写!
}
}
return 在 finally 语句块中间
同样的把 ruturn 放置到了 finally 语句块中的中间, return 下面的代码也是会爆红的,不允许这样写;
@Test
public void testTry() {
try {
return;
}catch (Exception e) {
return;
} finally {
System.out.println("cd");
return;
System.out.println("cd");// 代码爆红,错误的书写
}
}
return 在 finally 语句块最后面
在 finally 语句块的最后执行 return 是允许的,因为 finally 里面的代码已经正常执行结束了,return 对于 finally 语句块中的执行结果没有影响;
@Test
public void testTry() {
try {
return;
}catch (Exception e) {
return;
} finally {
System.out.println("cd");
return;
}
}
什么时候 finally 不会执行?
引用英文的解释:
There are few situations where the finally will not be executed like JVM crash, power failure, software crash and etc. Other than these conditions, the finally block will be always executed
1、虚拟机崩了
2、软件崩了
3、线程被强制结束了
其他的条件下,finally 里面的代码都是会正常执行的;
小结
在 finally 语句块中的代码,不会因为加不加 return 就会停止运行,只有遇到了异常里面的 Error ,finally 才会停止执行,因为程序运行的环境都奔溃了,finally 代码自然是不会执行下去的;