9.异常

  • 异常

    1. 在程序运行过程中,出现不正常的情况叫做异常;

    2. 注意:

      1. 相同的代码在运行的时候,根据输入的参数或者操作的不同,有可能会发生异常,有可能不会发生异常。应该在写代码的过程中尽可能保证代码的正确性。
      2. 如果要解决代码中出现的异常,需要添加非常复杂的代码逻辑来进行判断,会使代码变得非常臃肿,不利于维护,可读性比较差。因此,推荐使用异常机制来处理程序运行过程中出现的问题。
    3. Java中处理异常的关键字:

      1. try、catch、finally、throw、throws;
      2. 通过异常处理,程序即使在运行过程中出现问题,也可以对异常情况进行处理,同时后续代码也会继续执行,不会中断整个程序;
      3. 在异常处理过程中,不要只是简单的输出错误,要尽可能详细地将异常信息打印出来,e.printStackTrace():打印异常的堆栈信息。
      4. 当使用多重catch的时候一定要注意相关异常的顺序,将子类放在最前面的catch,父类放到最后面的catch。
      5. 在程序处理过程中,如果处理异常的部分出现finally的处理,那么无论代码是否发生异常,finally中的代码总会执行;除非在try块或者catch块中调用System.exit(1)方法;
        1. finally包含哪些逻辑处理:

          1. IO流的关闭操作一般设置在finally中;
          2. 数据库的连接关闭操作设置在finally中。
        2. finally返回(return的情况):

          1. 如果finally中有return语句,则回将try中的return语句覆盖掉,直接执行finally中的return语句,得到返回值,这样便无法得到try之前保留好的返回值;
          2. 如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句,会接着执行try中的return语句,返回保留之前的值;
          3. 如果finally中没有return语句,但是有改变要返回值,这里与引用相似,分以下两种情况:
            1. 如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句必然会返回进入finally块之前保留的值;
            2. 如果return的数据是引用数据类型,在finally中对该引用数据类型的属性值的改变是生效的,try中的return语句返回的就是在finally中改变后的该属性的值。
    4. 练习:
      9.异常

    5. 声明异常:

      1. 在方法调用过程中,可以有N多个方法调用,此时假如每个方法都包含了异常情况,可以将异常向外抛出,最后集中处理;
      2. 如何判断使用throws还是try...catch:
        1. 最稳妥的方式是在每个方法中都进行异常处理;
        2. “偷懒的方式是判断整个调用的过程中,外层的调用方法是否有对异常的处理,如果有,直接使用throws,如果没有,就要使用try...catch”。
    6. 自定义异常:

      1. 在Java中提供了非常丰富的异常类,但是在某些情况下不能满足需求,此时需要自定义类。步骤:

        1. 继承Exception类;
        2. 自定义实现构造方法;
        3. 需要使用的时候, throw new 自定义异常的名称。
      2. 什么情况下使用

        1. 一般情况不需要自己定义;除非公司明确要求,或者要求异常格式规范统一的时候是必须要求自己实现的。
    7. 异常分类:

      1. Error;
      2. Runtime Exception运行时异常;
      3. Exception;
      4. throw用户自定义异常。
    8. 常见的异常:
      1. NullPointerException空指针异常;
      2. ArrayIndexOutOfBoundsException数组越界异常;
      3. IOException输入输出异常;
      4. ClassCastException类型强制转换异常;
      5. FileNotFoundException文件未找到异常。

    9. throw与throws的区别:

      1. throw:

        1. 作用在方法内,表示具体抛出异常,有方法体内的语句处理;
        2. 具体向外抛出一个异常实体类。若执行了throw则表示一定发生了异常。
      2. throws:

        1. 作用在方法声明上,如果表示抛出异常,则由该方法的调用者来处理异常;
        2. 声明的方法可能会抛出该类型的异常,让调用该方法的使用者知道捕获异常的类型;
        3. 出现异常是可能性,而不是必然性。