一、异常体系结构
二、常见的运行时异常
1、数组越界异常:ArrayIndexOutOfBoundsException
2、算数异常:ArithmeticException
3、类型转换异常:ClassCastException
4、空指针异常:NullPointerException
5、类型不匹配异常:InputMismatchException
6、找不到文件异常:FileNotFoundException
三、常见编译时异常
1、InterruptedException
2、ClassNotFoundException
3、SQLException
四、程序在运行时,一旦出现异常,那么异常后面的代码将不再执行
五、异常处理(抓抛模型)
注意:能使用if判断时就使用if语句,不要使用异常
5/1 抛:当我们在执行一段代码是,一旦出现异常,就会在出现异常的代码处生成一个
对应的异常类对象,并将此对象抛出。
》》一旦抛出了异常类的对象,程序将终止运行。
》》此异常类的对象抛给方法的调用者。
5/2 抓:抓住上一步抛出来的异常类的对象。如何抓即为异常处理
5/3 Java提供了两种方式处理异常类的对象。
5/3/1 try…catch语句
try{
//可能出现异常的的代码
//(如:)读取网络信息:
//1、打开网络链接
//2、读取网络链接
//3、关闭网络链接(即释放资源,一般放在finally块里面)
}catch{
//处理异常的方式一
}catch{
//处理异常的方式二
}finally{
//程序一定会执行的代码
//一般讲释放资源等一些相关的代码放在这里
}
注意:1、try内声明的变量相当于局部变量,出了try块就不能再用
2、finally块是可选的
3、catch内部是对异常的处理(Throwable的常用方法)
String getMessage()
String toString()
String printStackTrace()
String printStackTrace(PrintStream ps)
4、可以有多个catch语句,try中抛出的异常类对象从上往下去匹配异常类的类型,一旦匹配就执行catch中的代码,执行完成就跳出其后的多条catch语句。
5、异常处理成功后,其后catch外的代码可以继续执行。
JDK7及以后可以使用下列方式实现多catch
try{
//可能出现异常的代码
}
catch(异常类型一 | 异常类型二 | 异常类型三 e){
if(e instanceof 异常类型一){
}
else if(e instanceof 异常类型二){
}
else if(e instanceof 异常类型三){
}
}
》》处理方式一:
自动抛(声明抛出异常):
1、如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,
则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调
用者负责处理。抛出的异常可以是运行时异常,也可以是非运行时异常
①运行时异常:调用方可以不使用try…catch捕获,编译可以通过,但如果出现异常,则JVM停止程序
②非运行时异常:调用方必须使用try…catch捕获,或者继续抛出,否则编译错误
2、在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法
中产生的异常类型,也可以是它的父类。
例:public static void methord1() throwsFileNotFoundException,IOException{}
3、子类重写的父类的方法抛出的异常范围只能比父类抛出的异常的范围小。
》》处理方式二:
手动抛(在方法内部抛出异常):throw+异常类对象,放在方法内
1、手动抛出的异常类可以是现成的也可以是自己创建的。
2、方式一:
throw new 异常类型("异常信息");
例: if(array == null){
throw new NullPointerException("控制正异常");
}
3、方式二:最好是自己不处理,抛给调用者处理
try{
}
catch(异常类型 变量){
throw 变量;//抛出
}
4、如果throw抛出的是一个:
4/1 运行时异常:
①在方法声明处,可以不声明throws
②调用方可以不使用try...catch
4/2 非运行时异常:
①在方法声明处必须声明throws抛出异常
②调用方必须使用try...catch
六、对于运行时异常可以不进行显示处理,但是对于编译时异常必须处理。
七、自定义异常类
1、自定义一个异常类,让这个类继承现有的异常类(可以使用Exception,也可以是其他已有的异常类)
2、重载几个构造器
八、多catch语句
1、多catch中的异常类型一般是平级关系,当平级关系时没有先后关系。
2、可以是父子关系,父类异常只能放在子类异常后面。
3、在JDK7的catch列表中只能是平级关系,不能出现父子关系
九、throws 和 throw的比较
1、throws:
①用在方法的声明处
②后面跟的是异常类名,可以是多个
③他表示此方法(可能)会抛出这些类型的异常对象
④如果抛出的异常类型:
A:运行时异常:调用方可以不用try...catch
B:非运行时异常:调用方必须try...catch
2、throw
①用在方法内部
②后面跟的是异常对象,只能有一个异常对象
③他是动词,(一定)抛出某类型异常
④抛出的异常类型:
A:运行时异常
方法声明处可以不使用thorws
调用方可以不使用try...catch
B:非运行时异常
方法声明处必须使用throws
调用方必须使用try...catch
十、final、finally和finalize的区别:
1、final(关键字):表示最终的,可以修饰成员变量、成员方法、类
成员变量:表示常量,其值只能被赋值一次,之后便不能再更改
成员方法:表示最终的方法,标志这个方法不能被子类重写
类:表示最终类,表示这个类不能被继承
2、finally(关键字):是异常处理机制的关键字
使用格式1:
try{
}
catch(){
}
finally{
}
使用格式2:
try{
}
finally{
}
表示finally中的语句,无论是否发生异常, 都会被执行
3、finalize(方法名);是Object类中的方法,当垃圾回收器回收对象空间之前会自动调用这个方法
十一、在finally语句之前有return语句
1、如果一个方法声明了返回值类型,则在try...catch...finally中的每个分支也必须有return语句
2、代码执行时,会先执行finally中的代码,在返回去执行return语句
3、在try...catch中有return语句时,在finally中对要返回的变量的值进行更改是无效的
4、在finally中也可以有return语句,此时try和catch中的return语句都会失效,此时执行finally中的return语句
十二、异常的一些常用格式
1、try...catch
2、try...catch...cahtch...catch
3、try...catch...finally
4、try...catch...catch...catch...finally
5、try...finally
十三、子类重写父类方法时:
父类方法没有抛出异常,则子类:
1、可以不抛出任何异常
2、可以抛出任何运行时异常
3、不能抛出任何的非运行时异常
父类抛出异常运行时异常
1、可以不抛出任何异常
2、可以抛出任何的运行时异常
3、不能抛出任何非运行时异常
父类抛出非运行时异常
1、可以不抛出任何异常
2、可以抛出任何运行时异常
3、只能抛出跟父类相同的非运行时异常,不能抛出比父类更多的非运行时异常
总结:
无论父类是否抛出异常:
子类:1、可以不抛出任何异常
2、可以抛出任何运行时异常
父类抛出的是非运行时异常:
子类:可以抛出和父类相同的异常,但不能抛出比父类更多的异常