版本:JDK1.8
注:观看尚硅谷视频的复习笔记
1、Throwable:是Error和Exception的父类。
2、Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:tackOverflowError(栈溢出)和OOM(堆溢出)。一般不编写针对性的代码进行处理。
3、Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:空指针访问、试图读取不存在的文件、网络连接中断、数组角标越界。
一、异常分类
1、编译时异常(受检异常)
2、运行时异常(非受检异常)
NullPointerException:空指针异常
ArrayIndexOutOfBoundsException:数组角标越界
StringIndexOutOfBoundsException:字符串角标越界
ClassCastException:类型转换异常
NumberFormatException:数值转换异常
InputMismatchException:输入不匹配异常
ArithmeticException:算术异常
二、异常处理方式
1、抓抛模型
(1)、抛:程序正常执行,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出,一旦抛出对象后,后面的代码不再执行。
(2)、抓:获得异常对象,并处理。
异常处理方式:try-catch-finally、throws
(一)、try-catch-finally
try{
//可能出现异常的代码
//抛出异常后 try内代码不再继续执行。
}catch(异常类型1 变量名1) {
//异常处理方式1
}catch(异常类型2 变量名2) {
//异常处理方式2
}finally{
//一定会执行的代码
}
1、finally是可选的
2、使用try将可能出现异常的代码包装起来,在执行过程中,一旦出现异常,就会出现一个异常对象,根据此对象类型,去catch中进行匹配
3、一旦try中异常匹配某一个catch时,就进入catch中处理,一旦处理完成,就跳出当前try-catch结构(若有finally则执行finally),继续执行后面的代码。
4、catch中的异常类型如果没有子父类关系,谁在上都无所谓;如果有子父类关系,则子类在上。
5、异常对象的常用方法:String getMessage()、void printStackTrace()
6、在try中声明的变量,try以外不可以调用。
7、处理编译时异常时,程序编译时不再报错,但运行时仍可能报错。
8、finally中代码一定执行,即使catch中出现异常,try、catch中有return语句,仍然执行,且在return之前首先执行finally。
9、运行时异常太多了,不考虑处理,但编译时异常一定要处理。
(二)、throws + 异常类型1,异常类型2
public void method() throws Exception {
}
1、写在方法声明处,当此方法执行时出现异常,会产生一个异常对象,此对象满足throws后异常类型时,就会被抛出,异常代码后续代码不再执行。
2、throws抛出异常给方法调用处,并没有将异常处理掉,可以连续向上抛出。
三、子类重写父类的抛出异常方法
1、重写的抛出异常类型不大于父类被重写的方法抛出的异常。
2、如果父类中被重写的方法没有throws方式抛出异常,则子类重写的方法也不能throws,如果子类重写的方法中出现异常,必须try-catch-finally处理异常。
四、手动创建异常
异常的产生:
1、系统自动生成异常对象
2、手动创建异常,并抛出(throw)
throw new NullPointerException("输入出错");
五、自定义异常类
继承异常类–>提供全局常量:serialVersionUID–>提供重载的构造器
//自定义异常类
public class EcDef extends Exception {
static final long serialVersionUID = -33875164229948L;
public EcDef() {
}
public EcDef(String msg) {
super(msg);
}
}