一.概述
1、生活中的异常
生活中不正常的事件。
2、程序中的异常
程序在运行时出现的错误!
程序中异常以类的方式表示,当程序中出现异常时,就是产生了某种异常类的对象。
而异常对象必须进行捕获并处理,如果不捕获,则异常对象由JVM处理。
而JVM处理异常的方式为:把异常信息输出在控制台,并终止程序。
二.异常继承结构
1.异常结构继承结构图
2、异常的分类
1) 运行时异常 :RuntimeException及子类。不强制处理
2)编译异常 :Exception类及非RuntimeException的子类。必须处理,如果不处理则引发编译错误
三.异常处理的第一种方法throws
1、throws关键词的使用:在方法上声明异常,此方法没有处理异常。由调用者处理
语法:
访问修饰符 返回值类型 方法名(参数列表)throws 异常类型,异常类型{方法体}
public class Test{
public static void main(String[] args) throws FileNotFoundException{
getIO();
System.out.println("程序结束");
}
public static void getIO() throws FileNotFoundException{
FileInputStream in = new FileInputStream("d:/a.txt");
}
}
四.处理异常的第二种方法try catch
1、try catch语法结构
try{
可以会出现异常的代码。
}catch(异常类型 变量名){ //捕获对应类型的异常对象,保证后续代码继续执行。
}
2、try catch的执行顺序
2.1:try中的代码 没有产生异常,则catch不执行,而执行try-catch后的代码
2. 2 :try中的某行代码产生了异常,则try中的后续代码不再执行,而到对应异常类型的catch执行,执行完catch后,执行try-catch后的代码
3、try块中带有多个catch时的注意事项
如果多个catch之间的异常类型之间有继承关系,则先子后父。
异常对象:取得异常描述信息:getMessage();取得异常的堆栈信息:printStackTrace();
五.异常的finally语块
1、finally语句块的含义
在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行
2、try,catch,finally三个关键词的执行顺序
3、何种情况下不执行finally块
异常处理代码中执行System.exit(1)退出Java虚拟机
六.final,finalize,finally区别
1 final:java中的关键字,修饰符。
1)、可以修饰类
如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类被继承。
2)、 可以修饰方法
被声明final的方法,不能被子类重写。
3)、修饰变量,
如果将变量或者方法声明为final,可以保证它们在使用中不被改变.
2 finally:java的一种异常处理机制。。finally 结构使代码总会执行,而不管有无异常发生。
3 finalize:Java中的一个方法名。
Java技术使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。
这个方法是由垃圾收集器在确定这个对象没有被引用时 对这个对象调用的。
它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。
finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。
七.手动抛异常throws
1、throw 异常对象
当程序中的某个代码产生异常:生成一个异常的对象,并抛出
异常都在代码里产生的,throw new 异常类型();
使用throw关键词抛出异常对象。
1) 可以抛出运行时异常: 可以不处理
2) 抛出编译异常: 必须处理。
2 当方法中抛出异常后要对此异常进行处理
1)、 throws在方法上添加异常的声明。
2) 、try-catch进行异常的捕获。
八.自定义异常(代码开发中常用)
1、自定义异常的语法
访问修饰符 class 类名 extends Exception或其子类{}
/*
*自定义异常类继承自某个异常类
*可以继承运行时异常:异常类可以不处理
*可以继承编译异常:异常类必须处理
*产生自定义异常类型:需要用throw
*/
public class AgeException extends Exception{
public AgeException(){
super();
}
public AgeException(String message){
super(message);
}
}
2 、产生自定义异常一定与throw关键词一起使用
public class Student(){
private int age;
public int getAge(){
return age;
}
public void setAge(int age) throws AgeException{
if(age >= 18&& age<=50){
this.age = age;
}else{
//产生一个异常对象,手动产生异常对象,并抛出
/*
*抛出编译异常,则必须捕获或声明
*/
throw new AgeException("年龄必须为18~50之间");
}
}
}