java中的异常处理---捕获异常或者抛出异常

一、java的异常体系

  Throwable    

    Error---错误。一般是由于jvm或者是硬件引发的问题,所以一般不会通过代码去处理,可以看下硬件或者外部对接系统或中间件等问题

    Exception----异常,一般是代码中的问题,通过修改代码去解决

二、异常的处理方式

  异常的捕获和异常的抛出

  捕获异常:

    try{

      可能出问题的代码;

    }catch(出现的异常类型 自定义变量){

      处理异常的代码

    }

如下代码:

public class ExcpetionDeal {
    public static void main(String[] args){
        div(4,0);
    }
    public  static void div(int a,int b){

        int result = 0;
        try{
             result =  a/b;    //这句代码在b = 0时明显不符合逻辑,可能会出现问题
        }catch (ArithmeticException e){     //ArithmeticException是异常类型
e.printStackTrace(); //我们处理的方式就是打印出出问题的栈 }
        System.out.println("result:"+result); 
}
}

  注意事项:  1、try{....}catch(){...} 中代码如果出现了异常,程序不会阻塞,外面的程序会继续执行下去

         2、try后面可以使用多个catch,处理多个类型的异常类型,但是第一个catch中异常类型的包含范围不能大于第二个catch中的类型(比如第一个catch异常类型是Exception,第二个catch中异常类型是ArithmeticException,Exception是一个总的 异常类,内部包括ArithmticException,这种情况下编译会报错)

         3、如果try块中的代码出现了异常,则try中异常代码后面的语句将不会被执行

  抛出异常:

    关键字:throw throws  

public class Throw {

    public static  void main(String[] args) throws  Exception{  //main方法可以选择抛出异常给jvm或者对异常进行捕获处理
        Div(4,0);
    }
    public static void  Div(int a,int b) throws  Exception{   //Div方法抛出异常给调用者main
        if (b==0){
            throw  new Exception();       
        }
        int result = a/b;
        System.out.println(result);
    }
}

  如上是当b = 0的时候对异常进行抛出的代码。。

  那么什么时候使用异常的捕获,什么时候使用异常的抛出呢?

     --------一般情况下,如果需要通知到调用者你的代码出现了问题,这个时候使用抛出处理,如果代码是与用户直接打交道的异常,千万不能再抛,再抛会抛给用户了这个时候就使用捕获处理了

  Exception中并不是包含了所有的异常类型,现实生活中还有许多的异常类型未被定义,这个时候我们可能需要自定义一些异常类型,去完成异常的处理;

举个例子:我要去吃一碗牛肉面,一万10块钱,当我钱不够的时候怎么办呢?这就相当于一种异常,我们需要事先定义一个异常类LessOfMoneyToEat

  

public class LessOfMoneyToEat extends  Exception {   定义一个异常类,继承自Exception类

    public LessOfMoneyToEat(String message){  定义一个都早方法传入一些信息
        super(message);
    }
}

  这种简单的写法其实就相当于自定义了一个异常类型,调用方法和其他异常类型调用方法是一样的: 

ublic class Main {

    public static  void  main(String[] args) throws LessOfMoneyToEat{  //直接抛出的写法
        int money = 9;
        /*    这里注释的写法是捕获的写法
        try{
            Eat(money);
        }catch(LessOfMoneyToEat e){
            e.printStackTrace();
            System.out.println("借点钱吃个饭。。。");
        }
        */
        Eat(money);
    }
    public static  void Eat(int money) throws LessOfMoneyToEat{

        if(money < 10){
            throw new LessOfMoneyToEat("啊哦,钱带少了。。。");
        }
        System.out.println("吃地沟油木桶饭。。。");
    }
}

  

  异常处理的时候有时候会使用到finally关键字

  fanally块:必须要有try才能使用

            finally块中的代码在任何情况下都会执行的,除非退出java虚拟机





认识了finally代码块之后,常用到的异常捕获的格式其实会有三种:  

    第一种: 比较适用于有异常要处理,但是没有资源要释放的。

      ry{

        可能发生异常的代码

      }catch(捕获的异常类型 变量名){

        处理异常的代码

      }

    第二种:比较适用于既有异常要处理又要释放资源的代码。

      try{

        可能发生异常的代码

      }catch(捕获的异常类型 变量名){

        处理异常的代码

      }finally{

        释放资源的代码;

      }

    第三种: 比较适用于内部抛出的是运行时异常,并且有资源要被释放。

      try{

        可能发生异常的代码

      }finally{

        释放资源的代码;

      }