java基础

java基础-day14-异常和集合

2021-06-26  本文已影响0人  触手不可及

异常和集合

1. 异常

1.1 生活中的异常
生病
    医生: 你是怎么了?
    我: 我难受
    医生: 你那里难受
    我: 我肚子疼
1.2 开发中的异常
 主要划分为两大类
    Error
    Exception
 统一的父类
    Throwable 异常和错误的基类
 
 主要了解的方法:
 构造方法 Constructor
    Throwable();
        创建或者说生成一个异常/错误类对象,异常/错误信息为null
    Throwable(String message);
        创建或者说生成一个异常/错误类对象,异常/错误信息为message
 
 成员方法:
    String toString();
        展示当前异常/错误的简要信息
    String getMessage();
        获取当前异常/错误的信息方法
    void printStackTrace();
        展示错误/异常的前因后果【红字】
package com.qfedu.a_throwable;

/**
 * Throwable常用方法演示
 * @author Anonymous
 *
 */
public class Demo1 {
    public static void main(String[] args) {
        // 创建了一个Throwable类对象 
        // Throwable throwable = new Throwable();
        Throwable throwable = new Throwable("急性肠胃炎");
        
        System.out.println(throwable.getMessage());
        System.out.println(throwable.toString());
        // throwable.printStackTrace();
        
        testThrowable();
    }
    
    public static void testThrowable() {
        new Throwable("测试错误").printStackTrace();
    }
}
1.3 异常和错误的区别
Exception 
    异常 可以处理,代码中也就不存在异常
Error 
    错误 只能避免

错误和异常根据报错结尾来判断不同的情况。

错误只能避免
异常有两种处理方式
    1. 捕获
    2. 抛出
1.4 捕获异常
格式:
    try {
        有可能出现异常的代码
    } catch (异常对象) {
        对应当前异常处理方式
    }
    
    try {
        有可能出现异常的代码
    } catch (异常对象) {
        对应当前异常处理方式
    } finally {
        用于关闭当前程序使用到的资源。
    }
package com.qfedu.a_throwable;

/*
 * 异常捕获注意事项:
 *      1. 当代码捕获异常之后,JVM会认为当前程序中并没有异常存在,继续执行代码
 *      2. 代码从异常发生开始,不在正常运行
 *      3. 代码中如果出现了多个异常,可以添加多个catch块进行捕获处理,对症下药
 *      4. Exception可以处理所有异常,但是不能处理所有的异常都用Exception,
 *      可以使用Exception捕获多余问题,或者说未发现问题
 *      5. 可以使用 | 位或在同一个catch 中捕获多个异常。后期IDE工具会鄙视你
 */
public class Demo3 {
    public static void main(String[] args) {
        test(20, 0, null);
    }
    
    public static void test(int num1, int num2, int[] arr) {
        int ret = 0;
        
        try {
            // 有可能出现异常的代码
            arr[0] = 10;
            System.out.println("你猜我运行吗???");
            ret = num1 / num2;
        } catch (ArithmeticException | NullPointerException e) {
            System.out.println("都是异常");
        } catch (Exception e) {
            System.out.println("Exception是所有异常的基类");
        }
        
        System.out.println("ret : " + ret);
    }
}
1.5 抛出异常
关键字:
    throw 
        在代码中满足条件的情况下,抛出异常
    throws 
        在【方法声明】位置告知调用者,这里有哪些异常抛出
package com.qfedu.a_throwable;

/*
 * 抛出异常特征:
 *      1. 抛出异常就是一个高级版的参数合法性判断
 *      2. 代码中如果使用throw抛出指定异常,必须在代码声明位置告知调用者
 *      当前方法存在哪些异常抛出
 *      3. 异常从抛出位置开始,之后的代码就不再运行。
 *      4. 同一个代码块中不得抛出多个异常,如果代码需要抛出多个异常,需要执
 *      行不同的判断条件。
 *      5. 如果调用的方法存在抛出异常, 这里需要采用异常处理方式,
 *          a. 捕获异常
 *          b. 抛出异常
 *      NullPointerException
 *      ArrayIndexOutOfBoundException
 */
public class Demo4 {
    public static void main(String[] args) 
            throws ArithmeticException, NullPointerException {
        try {
            test(10, 0, null);
        } catch (ArithmeticException | NullPointerException e) {
            System.out.println("当前代码存在异常问题");
        }
        
        test(10, 0, null);
    }
    
    /**
     * 方法功能概述
     * 
     * @param num1 参数1
     * @param num2 参数2
     * @throws ArithmeticException 当前方法抛出算术异常。
     * @throws NullPointerException 数组首地址不得为null
     */
    public static void test(int num1, int num2, int[] arr) 
            throws ArithmeticException, NullPointerException {
        // 在方法的声明位置告知调用者,该方法有哪些异常抛出。
        // 参数合法性判断
        /*
         * if (0 == num2) { System.out.println("Input Parameter is Invalid"); return; }
         */
        if (0 == num2) {
            // throw new 异常构造方法();
            throw new ArithmeticException("算术异常");
        }
        
        if (null == arr) {
            throw new NullPointerException("数组异常");
        }
        
        
        int ret = num1 / num2;
        System.out.println(ret);
    }
}
1.6 抛出和捕获使用情况图例
image.png
1.7 自定义异常
Java中异常众多!!!
    也满足不了我们的日常!!!

单身狗异常
网线断了异常
    Java中现有异常无法满足,自定义异常玩一玩了!!!
格式:
    class 自定义异常 extends Exception {
        // 无参数构造方法
        // 有参数构造方法
    }
    SingleDogException
    
package com.qfedu.a_throwable;

/**
 * 单身狗异常完毕!!!   
 *      错误日志记录
 * @author Anonymous
 *
 */
class SingleDogException extends Exception {
    
    // 无参数构造方法
    public SingleDogException() {}
    
    /**
     * 带有Message异常信息参数的构造方法
     * 
     * @param message String类型异常信息
     */
    public SingleDogException(String message) {
        /*
         * 调用父类的String类型构造方法。
         * super()  
         *      就可以直接调用父类的构造方法,会根据实际参数来选择对应的
         *      构造方法执行。
         */
        super(message);
    }
}
                  
public class Demo5 {
    public static void main(String[] args) throws SingleDogException {
        try {
            buyOneFreeOne(true);
        } catch (SingleDogException e) {
            // TODO Auto-generated catch block
            System.out.println(e.getMessage());
        }
        
        buyOneFreeOne(true);
    }
    
    /**
     * 买一赠一
     * 
     * @param single boolean true 真·单身狗
     * @throws SingleDogException 单身狗异常
     */
    public static void buyOneFreeOne(boolean single) throws SingleDogException {
        if (single) {
            throw new SingleDogException("路见不平一声吼");
        }
        
        System.out.println("书亦烧仙草买一送一, 美团有券9.9RMB");
    }
}

上一篇下一篇

猜你喜欢

热点阅读