Java异常处理机制

- 1 min

Java中处理异常的两种方式

当Java运行时系统得到一个异常对象时,他将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码。找到能够处理这种类型的异常的方法后,运行时系统把当前的异常对象交给这个异常方法后,这一过程称为捕获(catch)异常。如果Java运行时系统找不到可以捕获异常的方法,则运行时系统中将终止,相应的Java程序也将退出。

如果在一个方法中生成了一个异常,但是这一方法并不确切地知道该如何对这一异常事件进行处理,这时,一个方法就应该声明抛弃异常,使得异常对象可以从调用栈向后传播,直到有合适的方法捕获它为止。

Java中预定义的异常类

预定义的异常类

Error

Error标识不可能或难以恢复的严重问题,例如内存不足,程序一般不处理这类情况。

RuntimeException

RuntimeException指示设计或实现上的问题,如果程序正确运行,这样的情况是不应该出现的。

常见异常

try-catch语句

try{
        //打开文件
        //判断大小
        //分配内存
        //读入内存
        //关掉文件
    }catch(/*文件打开失败*/){
        //处理代码
    }catch(/*大小取值失败*/){
        //处理代码
    }catch(/*内存分配失败*/){
        //处理代码
    }catch(/*读取失败*/){
        //处理代码
    }catch(/*关闭文件失败*/){
        //处理代码
    }finally{
    //总是执行的代码,即使碰到return也执行finally后才return,除非遇到System.exit(),程序会立刻退出  
    }

throw/throws抛出异常

//抛出的对象必须是Throwable的子类
public int read () throws IOException{
                ......
    }

public static void main(String args[]) throws IOException, IndexOutOfBoundsException {
                ······
}

堆栈调用机制

堆栈处理机制

自定义异常类

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());
        }
    }
}
Inger Chao

Inger Chao

A girl willing to learn and progress

rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora qq quora wechat