• 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{
            释放资源的代码;
          }

        

     

     

    —————————————————————————————————————————————————————————————————————————————————————————————————————————————— 保持学习的劲头
  • 相关阅读:
    CopyOnWriteArrayList
    Herriot
    Prefix tree
    hadoop 测试框架
    Hadoop RPC
    OpenCV2马拉松第2圈——读写图片
    LCD深度剖析
    SharePoint 改动passwordWeb Part部署方案
    android小游戏模版—重力感应
    CSS(层叠样式表)基础知识
  • 原文地址:https://www.cnblogs.com/qkblogs/p/12868213.html
Copyright © 2020-2023  润新知