java中的异常处理以及finally的问题
java中的异常处理
1、java中的主要异常类型
1、受检查异常:jvm可以检查到的异常对象,在编译的时候就会报错,让你抛出异常,或者用try...catch处理。
2、非受检异常:jvm不能检查到的异常对象(例如运行时异常),只能程序员自己检查,自己处理。
2、try...catch...finally
(1)、finally啥时候运行
1、只要程序还在内存中,finally就会被执行
2、代码中,在finally之前使用System.exit(0)使得程序退出,将不会执行finally。
3、遇到断电,电脑崩溃导致的程序不能运行,finally也不会执行。
(2)、finally需要注意的问题
程序如果提前return,那么finally会被执行吗?
public class Test {
public static void main(String[] args) {
try {
System.out.println("程序执行了");
return;
} catch (Exception e) {
} finally {
System.out.println("finally执行了");
}
}
}
结果:
程序执行了
finally执行了
结论:
在程序中即使在finally之前返回了,finally也会被执行
return和finally之间执行关系究竟是怎么回事?
首先来看第一段代码:
public class Test {
public static void main(String[] args) {
System.out.println(test().age);
}
public static Person test() {
Person p= new Person();
try {
p.age = 10;
return p;
} finally {
p.age = 20;
}
}
}
class Person {
int age;
}
结果:
20
分析一下原因:
1、首先在栈内存中创建一个Person p的这么一个变量,然后堆内存中创建Person对象,把地址给p
2、p.age首先被赋值10,然后返回p,这个时候因为程序看到了有finally,所以return先把要返回的数据准备着,等finally执行完成后再执行
3、此时return拿到的值为一个地址值,即堆内存中的Person对象
4、当执行finally时候,我们修改的是堆内存中地址为0X123的对象的值
5、finally执行完成,最终返回,于是我们得到的p.age是20
然后我们来看第二段代码:
public class Test02 {
public static void main(String[] args) {
System.out.println(getNum());
}
public static int getNum() {
int a = 5;
try {
return a;
} catch (Exception e) {
return 0;
} finally {
a = 10;
}
}
}
结果:
5
分析一下原因:

1、首先我们在栈内存中定义一个int a = 5
2、然后我们在try中看到返回这个命令,于是把5准备着给return,等finally执行完毕
3、finally把a的值修改为10,但是因为此时return准备的值是5,所以最终返回的值是5
4、程序结束,返回值为5
3、throws关键字
throws使用时机
1、调用者传递过来的参数不对,需要调用者自行去解决
2、程序确实没办法处理了
浙公网安备 33010602011771号