一、Throwable类
Throwable 是异常类的最顶层父类。
他有两个子类:
1.Error类(错误:代表了JVM的本身错误)比如我们调用递归算法时,栈爆了这种情况。所以不要太关注。
2.Exception类(异常:可以被Java异常处理机制使用,学习的核心)
上关系图:
二、Java异常类分类
1.非检查异常:
顾名思义就是你写上去,编译器程序检查不到你错误,无法提示你写try{}catch(){}语句的异常。如:空指针异常,数组下标越界之类的。
当然你可以写上try-catch语句去捕获异常,但是最好在编写程序时就注意到这个错误。
2.检查异常
顾名思义就是你写上去程序会报错,必须写上try-catch语句的异常(或者你抛出异常)。因为它是未知的,比如文件名写错之类的。
三、异常的处理方式
1.通常对于检查异常类的对象我们要使用try-catch语句去捕获这个异常。
try {
int i = 1;
i = i/0;
} catch (ArithmeticException e) {
e.printStackTrace();
}
这种情况一定会发生ArithmeticException的错误,此时我们将其捕获,并输出它的错误信息。
2.try-catch-finally
try {
int i = 1;
i = i/0;
} catch (ArithmeticException e) {
e.printStackTrace();
}finally {
System.out.println("我没错");
}
finally的作用:
无论发生啥,就算是在catch语句里面有return语句,你也得执行,反正就是一定执行它,除非电脑傻掉了。
3.直接抛出异常,让上一级处理
如:
public static void main(String[] args) { testException(); } public static void testException() throws ArithmeticException{ int i = 1; i = i/0; }
交给主函数处理,如果主函数也抛出异常,那就jre去处理吧。
四、自定义的异常类
如:
public class UnHappyException extends Throwable{
}
一定要继承至Throwable类,你才算是异常类,一般来说我们添加三个构造方法。
public class UnHappyException extends Throwable {
//该构造方法, 抛出异常时e.printStack()它的名字
public UnHappyException() {
super();
}
//该构造方法,抛出异常时,打印message,也就是你定义的语句
public UnHappyException(String message) {
super(message);
}
//抛出异常时,打印message,还会给你说是因为cause这个异常而触发了我。(不开心)
public UnHappyException(String message,Throwable cause) {
super(message, cause);
}
}
五、散列笔记
1.可以try了有多个catch语句接收,但是异常类型得从小到大。
(不然一个Exception就全接收了,你不知道是哪个具体异常)
2.方法内部抛出异常用throw关键字,方法抛出异常用throws关键字
3.异常也是对象!
4.关于try-catch-finally语句
例子
public static int getA() {
int a = 0;
try {
a = 1;
return a;
} catch (Exception e) {
} finally {
a = 2;
}
return 5050;
}
该语句返回的值是1;
步骤1:先执行 a = 1;
2:将a的值存放到临时栈中。
3:执行finally语句修改a的值为2;
4:将临时栈里的值1返回出去。
若在finally方法中也有return句子,那么finally中的值将覆盖临时栈中的值。