黑马程序员技术交流社区

标题: 【成都校区】关于异常的一些内容 [打印本页]

作者: 生死无关    时间: 2018-11-22 12:48
标题: 【成都校区】关于异常的一些内容
以前一直都以为异常是错误的,必须进行处理的,没想到甚至可以自己创建异常,有意识的去自建异常。

异常概述:在代码的运行期间,由于代码的使用或者编写上的问题,出现了不正常的运行情况。
在Java中异常也是以对象的形式出现。
体系结构:Throwable                 Error : 不应该处理的问题,比如说电脑主板坏了,通过系统优化是解决不了的
                 Exception : 可以处理的问题,比如电脑中病毒,系统坏了,通过重装系统或者杀毒,就可以解决
异常分类:由于Error是不应该处理的问题,所以我们重点只研究:Exception
Exception
         编译期异常:
                 在编译期需要提前对异常进行【预处理】的异常,如果不处理则会编译失败。
                 如果是Exception除了RuntimeException之外的子类,则是编译期异常
                 举例:
                        1. ParseException
                        2. IOException
         运行时异常
                 编译期可以处理也可以不处理。
                 如果是RuntimeException及其子类则是运行时异常。
                 举例:
                        1. NullPointerException
                        2. ArithmeticException
                        3. ArrayIndexOutOfBoundsException
         比较两种异常区别:
                 本质上区别只有一点:编译期是否需要预处理。
                 编译期异常相较于运行时异常的区别只是编译期是否需要预处理,那么是否真正产生异常对象,那么还是看代码是否存在问题。
                         假设签订劳动合同:如果迟到就罚款100块。
                                 不是签订完合同就罚款,为了防止迟到,如果迟到了有方案去处理
                                 不是给出了预处理方案就已经出现了异常,代码有问题才出现,在出现问题后我们能有处理方案

异常对象产生分析:
    1. 如果代码出现了问题JVM帮我们创建了一个索引越界的异常对象(我们也可以主动产生异常)
    2. 整个异常对象,包含了异常的信息:异常产生的位置,异常产生的原因....
    3. 如果没有给出特定的处理,默认异常对象会抛给方法调用者
    4. 如果最终抛给了JVM。则JVM会给出默认的处理

JVM默认处理:
    1. 中断程序的执行
    2. 在控制台打印异常信息
        异常信息:异常的类别,异常的原因,异常的位置


异常的处理:1. 抛出
        1. 抛出异常(默认的处理)
        格式:throws 异常的类型
        位置:方法的参数列表后,在大括号之前
        作用:产生的异常对象会被抛出方法的调用者

                对于编译期异常来说,显式声明抛出编译异常则相当于给出了异常处理方案,则可以编译通过
                对于运行时异常来说,默认就是抛出异常,所以声明抛出与否没有区别。
2. 捕获异常
     格式:
        try {
            // 有可能产生异常的代码
        } catch (异常类型 变量) {
            // 如果捕获到异常后的处理方案
        }

     注意:
                1. catch中的代码只有当产生了对应的异常对象才会被执行
                2. 如果异常对象和catch的类型不匹配,则这个异常对象不能被此catch处理
3. 多异常的捕获处理
        方案:
        1. 每个有可能产生异常的代码都单独的try catch
        2. 一个try 多个catch

    注意:
        1. 如果有可能产生的异常未知,可以捕获一个父类型异常,此父类型异常和其任意的子类型异常都能被捕获
        2. 如果捕获多个异常有子父类关系,则父类catch必须在子类的后面
4. finally
    在try catch后,还可以有一个finally的部分,这部分的代码在任意的情况下都会被执行
    作用:可以把一些代码的收尾工作,写在此位置,无论异常是否产生是否被处理,finally的部分都会被执行





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2