解析java异常中的finally关键字
1 含义
try…catch.finally里面的可选结构
2 作用
2.1 内容
finally声明的是一定会被执行的代码
2.2 遇到以下三种情况也还是会去执行
2.2.1 catch里面继续出现了异常
a 示例代码
package Work;
public class Test {
public static void main(String[] args) {
try {
int a=10/0;
} catch (ArithmeticException e) {
int[] a=new int[10];
a[10]=100;
e.printStackTrace();
}finally {
System.out.println("finally里面的代码块");
}
}
}
b 示例代码运行截图
2.2.2 try代码块里面有返回值
a 示例代码
package Work;
public class Test {
public static void main(String[] args) {
System.out.println(f1());
}
public static int f1(){
try {
int a=10/2;
return 1;
//此时有返回值也不会立马返回,要等finally执行完成才能返回
// 若finally里面有返回,则会以finally里面的返回值为准
} catch (ArithmeticException e) {
System.out.println("有算术异常");
return 2;
}finally {
System.out.println("finally里面的代码块");
return 3;
//会以finally里面的返回值为准
}
}
}
b 示例代码运行截图
2.2.3 catch代码块里面有返回值
a 示例代码
package Work;
public class Test {
public static void main(String[] args) {
System.out.println(f1());
}
public static int f1(){
try {
int a=10/0;
return 1;
} catch (ArithmeticException e) {
System.out.println("正在处理算术异常");
return 2;
}finally {
System.out.println("finally里面的代码块");
return 3;
//finally只要有返回值,那么会以finally里面的返回值为准
}
}
}
b 示例代码运行截图
2.3 特殊情况
在try里面遇到System.exit(0)时,此时finally里面的代码不会去执行
示例代码
package Work;
public class Test {
public static void main(String[] args) {
System.out.println(f1());
}
public static int f1(){
try {
System.out.println("使用System.exit(0)方法之前");
System.exit(0);
int a=10/0;
return 1;
} catch (ArithmeticException e) {
System.out.println("正在处理算术异常");
return 2;
}finally {
System.out.println("finally里面的代码块");
return 3;
//finally只要有返回值,那么会以finally里面的返回值为准
}
}
}
示例代码运行截图
3 怎么用
3.1 使用场景
像数据库连接、输入输出流、键盘输入Scanner等资源,JVM是不能自动的回收的,我们需要自己手动的进行资源的释放.像这些的资源释放,就必须要放在finally里的代码块中
保证这些关闭操作不会被异常中断,能正常关闭
3.2 示例代码
package Work;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入数字n:");
try {
int number=scanner.nextInt();
}catch (InputMismatchException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally {
scanner.close();
//就算出现了异常,我们也可以把这个所占用的资源给关闭掉
System.out.println("scanner对象关闭了");
}
}
}