异常分类
- 编译异常
- 运行异常
- 逻辑异常
异常继承结构:
- Error: 严重异常错误 不可用用程序修改(一般发生于JVM中的异常)
- Exception: 即逻辑异常,运行异常,java编译器不会检查,程序本身可以处理的异常,可以捕获异常进行处理
- 非运行时异常:即编译异常,仅可能在程序中处理
- 非受查异常:java编译器不会进行检查
- 受查异常:java编译器会进行检查
异常处理
- 捕获异常
try{
// 可以发生异常的代码
}catch(可能出现的异常类型 e1){
// 处理异常逻辑
}catch(可能出现的异常类型 e2){
// 处理异常逻辑
}finally{
// finally部分可有可无
}
1.如果在try中没有发生异常,则直接指向finally中的代码逻辑
2.如果在try中发送异常,则会在catch中匹配相应的异常类型进行处理,再执行finally中的代码逻辑
3.建议多个catch类型时处理范围重小到大进行书写
- 声明异常
public FileInputStream(String name) throws FileNotFountException{
this(name != null ? new File(name): null);
}
1.关键字 throws 可能出现异常时可以使用throws进行抛出异常
2.子类声明异常的范围不能超过父类声明的范围
3.父类没有声明异常,子类也不能
4.子类重写的方法中声明的异常类,需要与父类被重写方法中声明的异常类保存一致,或是父类被重写方法中声明的异常类的子类
自定义异常
- 为什么要自定义异常:封装,快速定位
- 自定义异常的步骤:1.创建类;2.继承Exception类或者Exception的子类;3.重写构造方法
public class DemoException extends Exception{
public DemoException(){
}
public DemoException(String message){
super(message);
}
}
手动抛出异常
- 找到一个合适的异常类
- 创建这个异常类的对象
- 抛出这个对象
public class Daughter{
public static void main(String[] args){
Daughter d = new Daughter();
try{
d.eat();
}catch(DemoException e){
e.printStackTrace();
}
public void eat()throws DemoException{
System.out.println("出现异常了");
throw new DemoException("异常信息");
}
}
}
访问异常信息
- 堆栈轨迹(stack trace): 方法调用过程的列表
获取异常信息的重要方法(Exception类)
1.printStackTrace();
2.getStackTrace();