文章目录
- 关于try..catch中的finally子句
- 1、在finally子句中的代码是最后执行的,并且是一定会执行的,即使try语句块中的代码出现了异常。
- 2、finally语句通常使用在哪些情况下呢?
- 3、try和finally,也可以没有catch
- 4、退出JVM,finally语句不执行
- 关于finally的一道面试题
关于try…catch中的finally子句
1、在finally子句中的代码是最后执行的,并且是一定会执行的,即使try语句块中的代码出现了异常。
- finally子句必须和try一起出现,不能单独编写。
2、finally语句通常使用在哪些情况下呢?
通常在finally语句块中完成资源的释放/关闭
因为finally中的代码比较有保障
即使try语句块中的代码出现异常,finally中的代码也会正常执行
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class ExceptionText3 {
public static void main(String[] args) {
FileInputStream fis = null;//声明位置放到try外面,这样在finally中才能用
try{
//创建输入流对象
fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\学习.txt");
//开始读文件...
String s = null;
//这里一定会出现空指针异常!
s.toString();
System.out.println("hello world!");
//流使用完需要关闭,因为流是占用资源的
//即使以上程序出现异常,流也必须要关闭
//放在这里有可能流关不了
//fis.close();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}catch(NullPointerException e){
e.printStackTrace();
}finally {
System.out.println("hello 浩克");
//流的关闭放在这里比较保险
//finally中的代码是一定会执行的
//即使try中出现了异常!
if(fis != null) {//避免空指针异常
try {
//close方法有异常采用捕捉的方式
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("hello kitty!");
}
}
fis.close
未被注释前:
修改后:
3、try和finally,也可以没有catch
- try不能单独使用。
- try 可以和finally联合使用。
以下代码的执行顺序:
先执行try…
再执行finally
最后执行return(return语句只要执行方法必然结束)
public class ExceptionText4 {
public static void main(String[] args) {
try {
System.out.println("try...");
return;
}finally {
//finally中的语句会执行。能执行到。
System.out.println("finally...");
}
//这里不能写语句,因为这个代码是无法执行到的。
//System.out.println("Helloword");
}
}
运行结果:
4、退出JVM,finally语句不执行
public class ExceptionText5 {
public static void main(String[] args) {
try {
System.out.println("try..");
//退出JVM
System.exit(0);//退出JVM之后,finally语句中的代码就不执行了!
}finally {
System.out.println("finally..");
}
}
}
运行结果:
关于finally的一道面试题
public class ExceptionText5 {
public static void main(String[] args) {
int result = m();
System.out.println(result);//结果为100
}
public static int m(){
int i = 100;
try {
//这行代码出现在int i = 100的下面,所以最终结果必须是返回100
//return语句还必须保证是最后执行的。一但执行,整个方法结束。
return i;
}finally {
i++;
}
}
}
最后的结果为 100
:
解释: Java语法中有这样一条规则:
- 方法体中的代码必须遵循自上而下顺序依次逐行执行(亘古不变的语法!)
Java中还有一条语法规则:
- return语句一但执行,整个方法必须结束(亘古不变的语法!)
反编译之后的结果:
public static int m(){
int i = 100;
int j = i;
i++;
return j;
Exception exception;
exception;
i++;
throws exception;
}