异常 【掌握】
异常的概述
什么是异常
就是程序的运行的过程中,出现的不正常情况。

    异常的继承体系结构
        java是面向对象的语言,在java中要研究任何的东西都必须先封装成对象,对象一定会有对应的类。
        异常也是一样的,封装了对象之后就可以更加方便的研究和处理异常,异常有很多,那么对应的异常类
        也会有很多。这些异常类的共性不断向上抽取,就形成了异常的继承体系结构。

        Throwable
            |-Error:严重的错误,无法通过异常处理语句进行处理的,这里的问题有些是硬件的问题、或者是需要修改代码逻辑才能解决的问题
            |-Exception:非严重的错误,可以通过异常处理语句进行处理的
                |-编译时异常
                |-运行时异常

        注意:
            1、我们要研究的是Exception子体系
            2、异常类非常多,但是这些异常类不需要单独一个个去学习,因为他们的区别只是一个名字的区别
               异常根据名字做到区分,取名是遵循见名知义的原则,见到类名就知道这是什么异常。


    异常的分类
        编译时异常:
            Exception下除了RuntimeException及其子类之外的都是属于编译时异常
            编译时异常在编译时期就会报出,如果没有处理编译就会报错
        运行时异常:
            RuntimeException及其子类
            运行时异常在编译时期不会报出,编译时期不处理不会报错

    JVM默认处理异常的方式
        1、在异常发生处停止程序的运行
        2、将发生的异常信息以红色字体的方式打印在控制台


    异常处理语句
        方式一:声明抛出处理 throws
            // 在方法的声明处,使用throws关键字将异常类名进行抛出的处理方式
            修饰符 返回值类型 方法名(参数列表) throws 异常类名 {
                方法体;
            }

            throws这种处理方式一般是对编译时异常进行处理,一般不会对运行时异常进行处理,因为没有意义

            throws抛出处理的方式并不是正在的在处理问题,而是一种踢皮球的方式,将自己的问题踢给别人,
            从而达到自己没有问题,但是别人接收到了这个问题,别人还是要处理。
            throws真正能处理只是程序的编译报错问题

        方式二:捕获处理  try...catch
            格式一
                try{

                }catch(异常类名 变量名) {

                }

            格式二
                try{

                }catch(异常类名 变量名) {

                }finally {

                }

            格式三
                try{

                }finally {

                }


            格式的注意事项:
                1、只有以上三种格式组合
                2、try和finally语句只能有一个,catch语句可以有多个
                3、try:检测、尝试
                       一般存放的是可能会出现异常的代码,进行检测看到底有没有异常
                   catch:捕获
                        如果在try中检测到出现了异常,则会通过catch进行捕获并处理
                        catch小括号是用于捕获的
                        catch大括号是用于处理的
                   finally:最终
                        它表示一定会执行的语句,最终不管是否出现异常都一定会执行的语句
                        比如:一些资源的释放代码这类收尾性的代码


            总结:
                throws一般用于处理编译时异常,处理编译报错,但是没有真正处理调用异常,一般不处理运行时异常
                try...catch既可以处理编译时异常,也可以处理运行时异常,是一种真正处理异常的方式

    throw和throws的区别
        throw:它不是处理异常的方式之一,你可以将它理解为制造异常并抛出给使用者,告诉使用者要处理这个问题
                throw使用在方法中,throw后面跟的是异常对象(名),后面跟的对象只能有一个
                NullPointerException e = new NullPointerException();
                throw e;// 异常对象名

                throw new NullPointerException();// 异常对象

        throws:是异常处理的方式之一,抛出处理异常
                throws使用在方法声明上,throws后面跟的是异常类名,后面跟的异常类名可以是多个



自定义异常                           【了解】
    什么是自定义异常
        就是我们不使用JDK提供的那些异常(类),而是自己定义异常类

    为什么要自定义异常
        为了做到见名知义
        其实JDK提供的异常我们也都能使用,只不过我们希望做到,看到异常类的名字就能反映
        这个异常出现了什么问题。

    如何自定义异常
        1、创建一个类继承Exception或者RuntimeException
            * 如果想自定义一个编译时异常,就继承Exception
            * 如果想自定义一个运行时异常,就继承RuntimeException
        2、生成一些构造方法,我们就给两个即可:一个空参,一个带字符串参数的构造(可以传递异常出现的原因)

    自定义的异常如何使用
        和JDK提供的这些异常一样使用

Collection-List 【掌握】
常用集合类的体系结构
单列集合
Collection
|-List:存取有序,有索引,可以存储重复元素的
|-ArrayList:底层使用的是数组结构
|-LinkedList:底层使用的是双向链表结构
|-Vector
|-Set:不保证存取有序,无索引,不能存储重复元素
|-HashSet
|-TreeSet

    双列集合
    Map
        |-HashMap
        |-TreeMap

    学习体系结构的时候都应该从上往下学,最上面的类(接口)定义了最多的共性

Collection接口
    成员方法
        boolean add(E e) 添加元素

        boolean remove(Object o) 从集合中移除指定的元素
        boolean removeIf(Object o) 根据条件进行移除
        void clear() 清空集合中的元素

        boolean contains(Object o) 判断集合中是否存在指定的元素
        boolean isEmpty() 判断集合是否为空

        int size() 集合的长度,也就是集合中元素的个数

        Iterator<E> iterator()  集合的遍历方法

             // 获取到迭代器
             Iterator<String> it = coll.iterator();

             while(it.hasNext()) {
                String s = it.next();
             }


        Collection中没有任何一个和索引相关的方法。
        以下属于Collection接口中的方法的是(C)
            A、remove(int index)
            B、set(int index,E e)
            C、add(E e)
            D、add(int index,E e)
迭代器(Iterator)
    就是一个遍历集合的工具。

    成员方法
        boolean hasNext():判断集合中是否还有下一个元素,如果有就返回true,否则返回false
        E next()  :获取下一个元素,并将光标往下移动一位
        void remove() :在迭代器遍历的时候支持删除操作


增强for
    for(元素数据类型 变量名:单列集合或者数组){
        // 变量名中记录的就是集合中的每一个元素

    }

    快捷键:iter + 回车
集合的遍历方式
    1、普通for循环,使用get(int index)和size()方法             【只能适用于List子体系下的集合】
        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            System.out.println(s);
        }

    2、迭代器                                                 【适用于所有的单列集合】
        Iterator<String> it = list.iterator();
        while(it.hasNext()) {
            String s = it.next();
            System.out.println(s);
        }


    3、增强for                                                 【适用于所有的单列集合】
        for(String s:list){
            System.out.println(s);
        }

List子体系
List是Collection的子接口,所以Collection中的所有的方法List中都有(共性),
除此之外,List中还有自己特有的方法

特点:
    存取有序
    有索引
    可以存储重复元素的

特有方法(都是和索引相关的方法)
    void add(int index,E element) 在此集合中的指定位置插入指定的元素
    E remove(int index) 删除指定索引处的元素,返回被删除的元素
    E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
    E get(int index) 返回指定索引处的元素



数据结构
    栈:先进后出,后进先出(LIFO) last in first out
    队列:先进先出,后进后出
    数组:查询修改快,增删慢
    链表:查询修改慢,增删快

    红黑树
    哈希表



节点(Node)
    记录上一个节点的地址
    数据值
    记录下一个节点的地址