异常类
java中所有异常类都是Throwable 类的子类,它以及它的子类的实例对象都可以通过throw语句抛出。
Throwable类有两种访问异常信息的方法:
- getMessage :返回String 类型的异常信息
- printStackTrace:打印跟踪方法调用栈而获得的详细异常信息。在程序调试阶段,此方法可用于跟踪错误。
Throwable类有两个直接子类:
- error类:单靠程序无法恢复的严重错误,如内存空间不足、java虚拟机方法调用栈溢出等。在大多数情况下,建议将程序直接终止
- exception类:其下又有两个直接子类:(1)IOException 类:操作输入流和操作输出流可能出现的异常。(2)RuntimeException 运行时异常。
如上图,异常又可划分为checked异常和unchecked异常,区别在于编译器是否会检查它。
对于unchecked异常而言:
编译器不会检查它,也就是说,当程序中出现此类异常的时候,即使没有用try-catch语句捕获它,也没有用throws子句声明它,也会编译通过。这类异常,程序代码无法对其进行处理恢复,所以当程序出现此类异常的时候,就会导致程序异常终止。
对于checked异常而言
编译器会检查它,也就是说当出现此类异常的时候,要么用try-catch语句捕获它。要么用throw语句声明它,否则编译无法通过。此类异常,表示程序可以对其进行处理的异常,即使抛异常的方法本身不能处理它,方法的调用者应该去处理它,从而使程序恢复运行,不至于终止程序。
异常处理
- try catch语句:捕获异常
try{
可能会出现异常的代码
}catch(IOException){
处理捕获的异常
}
- finally语句:任何情况下都必须执行的代码
try{
可能会出现异常的代码
}catch(IOException){
处理捕获的异常
}finally{
System.out.println("finally");
}
- throws语句:声明可能会出现的异常
public void method()throws IOException,SQLException{...}
注意此种情况下,方法内语句中一定会抛出异常,其在此方法内无法对其进行处理。
- throw语句:抛出异常
public void run()throws CarWrongException{
if(车子无法刹车) throw new CarWrongException("车子无法刹车");
}
注意throw语句抛出的对象一定是Throwable类或者其子类的实例。
throw new String("车子无法刹车");//编译错误,String类不是异常类型
自定义异常
在特定的问题领域,通过扩展Exception类或者RuntimeException类来进行创建自定义异常。
public class LateException extends Exception{//继承于某原有异常
private LocalTime arriveTime;//定义私有成员变量
//设置构造异常
public LateException(String reason,LocalTime arriveTime){
super(reason);
this.arriveTime = arriveTime;
}
public LocalTime getArriveTime(){
return arriveTime;
}
}
//采用以下代码来抛出上述异常
throw new LateException("车子故障",Localtime.now());
//采用以下代码在catch 语句块中处理异常
try{
//可能抛出此上述异常的情况
if(...) throw new LateException("...",...);
}catch(LateException e){
//进行处理,可以输出异常信息,即异常定义中的属性
System.out.println("迟到原因:"+e.getMessage);
System.out.println("到达时间:"+e.getArriveTime);
}