清晨

新的开始

导航

异常

Posted on 2014-04-02 20:36  gdds  阅读(173)  评论(0)    收藏  举报

异常的关系:

        Throwable

     Error       Exception

                       Runtime Exception

异常的分类:

Error: 称为错误,由Java虚拟机生成并抛出,包括动态链接失败,虚拟机错误等,程序对其不做处理

Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示的声明或捕获

Runtime Exception:一类特殊的异常,如:被0除,数组下标超范围等,其产生比较频繁,处理麻烦,如果用户显示的声明或捕获将会对程序的可读性

和运行效率影响很大,因此由系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理)

 

如果某个方法后面跟着throws 抛出异常的类型 那么必须try catch

关键字:

     throws 要抛出异常的类型

     throw  抛出异常对象

基本流程:

     try{

               try语句

     }catch(异常类型1 异常对象1){ //捕捉异常 如果有异常对象与异常类型匹配 执行异常处理语句

            异常处理语句

     }catch(异常类型2 异常对象2){  //如果没有异常发生或没有异常对象与异常类型匹配 那么就跳过异常处理语句

         异常处理语句

     }finally{   //无论是否捕捉异常 最终都会执行finally语句 一般finally语句用于关闭资源

         finally语句

     }

 

小知识点:

       注意:子类重写父类的方法必须抛出与原方法所抛出异常的类型一致,或不抛出异常

package Test14;

 

import java.io.IOException;

//父类

public class A {

    public void call() throws IOException{

       System.out.println("bb");

    }

}

 

package Test14;

 

import java.io.FileNotFoundException;

//子类

public class B1 extends A {

    public void call() throws ArithmeticExecption{ //与父类方法抛出的异常不一致,错误!!

       System.out.println("aa");

    }

    public static void main(String[] args) {

       try {

           new B1().call();

       } catch (FileNotFoundException e) {

           e.printStackTrace();

       }

    }

}

 

 

package Test14;

 

import java.io.IOException;

//子类

public class B2 extends A {

 

    public void call() throws EOFException { //与父类方法抛出的异常不一致,错误!!

       System.out.println("cc");

    }

    public static void main(String[] args) {

       new B2().call();

    }

 

}

 

 

例子1:

//加法类

public class Add {

   public int add(Object number) throws ArithmeticException{ //throws关键字后边跟的是要抛出异常的类型

       if(number.equals("a")){

          throw new ArithmeticException("传进来的值不合法"); //throw关键字后边才是抛出的异常对象 也可以不抛出这个异常对象,直接throws 这时调用这个方法的方法也可以catch(捕获)

       }

       return 0;

   }

}

//测试类

public class Test {

    public static void main(String[] args) {

       try{

       Add add=new Add();

       add.add("a");  //add方法会抛出异常

       }catch(ArithmeticException e){ //捕获add方法抛出的异常对象并处理

           System.out.println("传进去的值不能是字符串");

       }

    }

}

 

例子2:

 

package Test14;

//定义自己的异常

public class MyException extends Exception {

    private int id; // 异常的id号

    public MyException(String message, int id) {

       super(message);

       this.id = id;

    }

    public int getId() {

       return id;

    }

}

 

package Test14;

 

public class Test {

    //判断登记人数

    public void regist(int num) throws MyException{

       if(num<0){

           throw new MyException("人数为负值,不合法",3);  //3为这个异常的id

       }

       System.out.println("登记人数"+num);

    }

    //调用管理方法

    public void manager(){

       try {

           //调用登记人数

           regist(-1);

       } catch (MyException e) {

           System.out.println("登记失败,出错代码:"+e.getId());

           e.printStackTrace();

       }

       System.out.println("操作结束");

    }

    public static void main(String[] args) {

       new Test().manager();

    }

}

 

异常信息:

登记失败,出错代码:3

操作结束

Test14.MyException: 人数为负值,不合法

    at Test14.Test.regist(Test.java:7)

    at Test14.Test.manager(Test.java:15)

    at Test14.Test.main(Test.java:23)