异常类
Java中处理异常的两种方式
- 捕获异常:就地解决,并使程序继续执行
//积极的处理方式
当Java运行时系统得到一个异常对象时,他将会沿着方法的
调用栈
逐层回溯,寻找处理这一异常的代码。找到能够处理这种类型的异常的方法后,运行时系统把当前的异常对象交给这个异常方法后,这一过程称为捕获(catch)异常。如果Java运行时系统找不到可以捕获异常的方法,则运行时系统中将终止,相应的Java程序也将退出。
- 声明抛弃异常:将异常抛出方法之外,由调用该方法的环境去处理
//消极的处理方式
如果在一个方法中生成了一个异常,但是这一方法并不确切地知道该如何对这一异常事件进行处理,这时,一个方法就应该声明抛弃异常,使得异常对象可以从调用栈向后传播,直到有合适的方法捕获它为止。
Java中预定义的异常类
Error
Error标识不可能或难以恢复的严重问题,例如内存不足,程序一般不处理这类情况。
RuntimeException
RuntimeException指示设计或实现上的问题,如果程序正确运行,这样的情况是不应该出现的。
常见异常
- NullPointException–空指针异常
- ArrayIndexOutOfBoundsException–数据越界异常
- NegativeArraySizeException–数组负下标异常
- ArithmeticException–算数异常类
- ClassCastException–算数运算异常
- IllegalArgumentException–传递非法参数异常
- ArrayStoreException–向数组中存放与数组类型不符元素异常
- NumberFormatException–数字格式异常
- SecurityException–安全异常
- UnsupportedOperationException–不支持的操作异常
try-catch语句
try{
}catch(){
}catch(){
}catch(){
}catch(){
}catch(){
}finally{
}
throw/throws抛出异常
public int read () throws IOException{
......
}
public static void main(String args[]) throws IOException, IndexOutOfBoundsException {
······
}
堆栈调用机制
- 如果一个try-catch块中没有处理,那么将会抛向此方法的调用者
- 如果一个异常回到main方法,而且也没有处理,那么程序终将终止
自定义异常类
public class MydateException extends Exception{
private String reason;
public MydateException(String r){
reason = r;
}
public String getReason(){
return reason;
}
}
public class Mydate {
int year,month,day;
void setDate(int year,int month,int day) throws MydateException{
if(day>31)
throw new MydateException("day too big");
this.year = year;
this.month = month;
this.day = day;
}
public static void main(String[] args){
Mydate t = new Mydate();
try {
t.setDate(2001,1,100);
}catch (MydateException e){
System.out.println(e.getReason());
}
}
}