美文网首页
异常处理

异常处理

作者: 陶宁 | 来源:发表于2018-02-11 18:03 被阅读0次

    JAVA严格的异常处理机制和类型检查机制

    异常处理
    手贱异常
    非手贱异常

    异常链处理

    异常是在程序出错的时候能知道程序哪里出错了

    如果程序异常在底层报出以后 在过程中丢了 没有暴露出来 这个是不能容忍的

    需要保证异常在一级一级的抛出的时候能保证异常没有丢失

    异常:阻止当前方法或作用域顺利执行的问题
    异常处理的意义和作用
    java所有异常的根是 Throwable 类
    Throwable 类有两个自类 Error类和Exception类
    Error类 主要有 虚拟机错误(VirtualMachineError) 线程死锁(ThreadDeath)
    Exception类:编码、环境、用户操作输入出现问题
    分为 非检查异常 和 检查异常

    处理异常
    try-catch 以及 try-catch-finally

            Scanner input = new Scanner(System.in);
            try{int one = input.nextInt();
                    int two = input.nextInt();
                    System.out.println(one/two);}
            catch(InputMismatchException e){
                System.out.println("输入的数字必须为正整数");} 
            catch(ArithmeticException e){
                System.out.println("除数不能为0");}
            catch(Exception e){
                System.out.println("其他异常");}
    

    异常抛出必须先小后大

    测试一个 try catch 方法
    e.printStackTrace();
    这个方法是:在命令行打印异常信息在程序中出错的位置及原因。

    package Java;
    public class ex1 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ex1 a = new ex1();
            int b = a.test();
            System.out.print("test方法运行完毕,返回值为"+b);
            
        }
        /**
         * divider(除数)
         * result(结果)
         * try-catch捕获while循环
         * 每次循环,divider减一 result = result+100/divider
         * 如果 捕获异常 打印输出“抛出异常了!!!” 返回 -1
         * 否则 返回 rusult
         * @return
         */
        public int test() {
            int divider = 10;
            int result = 100;
            try {
            while (divider > -1) {          
                divider --;
                result = result+100/divider;
                System.out.println(result);
            }
            }catch(Exception e) {
                e.printStackTrace();
                System.out.println("抛出异常了!!!");
                result = -1;
            }
            return result;
        }
    
    }
    

    try-catch-finally
    在try捕获到异常执行了catch之后在返回main之前先执行了finally;
    1、try
    2、有异常执行catch
    3、执行finally
    4、返回main函数

    package Java;
    public class ex1 {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ex1 ex = new ex1();
            int result = ex.test();
            System.out.print("test方法运行完毕,返回值为"+result);
        }
        /**
         * divider(除数)
         * result(结果)
         * try-catch捕获while循环
         * 每次循环,divider减一 result = result+100/divider
         * 如果 捕获异常 打印输出“抛出异常了!!!” 返回  result = 999
         * 否则 返回 rusult
         * finally:打印输出“这是finally!!!哈哈!!”,同时打印输出 result值
         * @return
         */
        public int test() {
            int divider = 10;
            int result = 100;
            try {
            while (divider > -1) {          
                divider --;
                result = result+100/divider;
                System.out.println(result);
            }
            }catch(Exception e) {
                e.printStackTrace();
                System.out.println("抛出异常了!!!");
                result = 999;
                return result;
            }
            finally {
                System.out.println("这是finally!!!哈哈!!" + result);
            }   
            return result;
        }
    }
    

    如果在try-catch-finally语句之内没有return语句则会调用之外的语句

    package Java;
    public class ex1 {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ex1 ex = new ex1();
            int result = ex.test();
            System.out.print("test方法运行完毕,返回值为"+result);
        }
        /**
         * divider(除数)
         * result(结果)
         * try-catch捕获while循环
         * 每次循环,divider减一 result = result+100/divider
         * 如果 捕获异常 打印输出“抛出异常了!!!” 
         * 否则 返回 rusult
         * finally:打印输出“这是finally!!!哈哈!!”,同时打印输出 result值
         * 最后返回1111作为结果
         * @return
         */
        public int test() {
            int divider = 10;
            int result = 100;
            try {
            while (divider > -1) {          
                divider --;
                result = result+100/divider;
            }
            }catch(Exception e) {
                e.printStackTrace();
                System.out.println("抛出异常了!!!");
            }
            finally {
                System.out.println("这是finally!!!哈哈!!" + result);
            }
            System.out.println("这里是try-catch-finally之外的最后一句");
            result = 1111;
            return result;
        }
    }
    

    java中的异常抛出

    throw

    throws - 声明将要抛出何种类型的异常(声明)
    public void 方法名(参数列表)
    throws 异常列表{
    //调用会派出异常的方法或者:
    throw new Exception();
    }

    自定义异常
    class 自定义异常类 extends 异常类型{
    }

    package Java;
    
    public class ex extends Exception{
        public ex() {
            super();
        }
        public ex(String message) {
            super(message);
        }   
    }   
    

    异常链

    package Java;
    public class ex3 {
    /**
     * test1():抛出"第一个异常"异常
     * test2():调用test1();捕获“第一个异常”异常,并且包装成运行时异常,继续抛出
     * main方法中,调用test2()尝试捕获test2()方法中的异常
     * @param args
     * @throws ex 
     */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ex3 ex3 = new ex3();
            try{
                ex3.test2();
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }
    
        public void test1() throws ex {
            throw new ex("第一个异常");
        }
        public void test2() {
            try {
                test1();
            } catch (ex e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            RuntimeException newExc = new RuntimeException("第二个异常");
            newExc.initCause(e);
            throw newExc;
            }
        }
    }
    
    image.png image.png

    相关文章

      网友评论

          本文标题:异常处理

          本文链接:https://www.haomeiwen.com/subject/ergzoxtx.html