异常的概念:

  • 指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。
  • 异常本身就是一个类,产生异常就是创建异常对象并抛出一个异常对象,java处理异常的方式是中断处理。
  • 异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行。

异常体系:

  • 异常的根类是java.lang.Throwable
    • java.lang.error(攻城狮不能处理,只能尽量避免)
    • java.lang.Exception(平时所说的异常的这类)(由于使用不当导致,可以避免)

异常分类:

  • Exception:编译期异常,进行编译(写代码)java程序出现的问题。
    • RuntimeException:运行期异常,java程序运行过程中出现的问题
    • 异常就相当于程序得了一个小毛病(感冒,发烧),把异常处理掉,就可以继续运行。
  • Error:错误
    • 错误相当于程序得了一个无法治愈的毛病,必须修改源代码,程序才能继续执行。

Java异常处理的五个关键字:

  • try、catch、finally、throw、throws
  • 抛出异常throw
    • 可以使用throw关键字在指定的方法中抛出指定的异常
    • 使用格式
      • throw new xxxException("异常产生的原因")
    • 注意:
      • 1、throw关键字必须写在方法的内部
      • 2、throw关键字后面new的对象必须是Exception或者Exception的子类对象
      • 3、throw关键字抛出指定的异常对象,我们就必须处理这个异常对象
        • throw关键字后面创建的是RuntimeException或者是RuntimeException的子类对象,我们可以不处理,默认交给JVM处理
        • throw关键字后面创建的是编译异常,我们就必须处理这个异常,要么throws,要么try…catch
      • 以后工作中,我们首先必须对方法传递过来的参数进行合法性校验,如果参数不合法,那么我们就必须使用抛出异常的方法,告知方法的调用者,传递的参数有问题。
  • Objects非空判断
    • Objects.requireNonNull(obj);
    • Objects.requireNonNull(obj,"传递的对象为空");
  • 声明异常throws
    • 异常处理的第一种方式,交给别人处理
    • 作用
      • 当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象
      • 可以使用throws关键字处理异常对象,会把异常对象声明抛出给方法的调用者处理(自己不处理,给别人处理),最终交给JVM处理(中断处理)
    • 使用格式:修饰符 返回值类型 方法名(参数列表) throws xxxException{}
    • 注意事项:
      • throws关键字必须写在方法声明处
      • throws关键字后边声明的异常必须是Exception或者是Exception的子类
      • 方法内部如果抛出了多个异常对象,那么throws后边必须也声明多个异常
        • 如果抛出的多个异常对象有子父类关系,直接声明父类异常即可
      • 调用了一个声明抛出异常的方法,我们就必须的处理声明的异常,要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM,要么try…catch自己处理异常
  • try…catch:异常处理的第二种方式,自己处理异常
    • 格式:try{

                                                可能产生异常的代码

                                            }catch(定义一个异常的变量,用来接收try中抛出的异常对象){

                                                   异常的处理逻辑,对象异常之后,怎么处理异常对象

                                                     一般工作中,会把异常的信息记录到一个日志中

                                            }…(catch可以有多个)

  • 注意事项
    • try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象
    • 如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try…catch之后的代码
    • 如果try中没有产生异常,那么就不会执行catch中异常的处理逻辑,执行完try中的代码,继续执行try…catch之后的代码

Throwable类中定义了3个异常处理的方法

  • String getMessage():返回此throwable的尖端描述
  • String toString():返回此throwable的详细消息字符串
  • void printStackTrace():JVM打印异常对象,默认此方法,打印的异常信息是最全面的

finally代码块:

  • 有一些特定的代码无论是否发生异常,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
  • 什么时候的代码必须最终执行?
    • 当我们在try语句块中打开了一些物理资源(磁盘资源、网络连接、数据库连接等),我们都要在使用完之后,最终关闭打开的资源。
  • finally的语法:

try…catch…finally:自身需要处理异常,最终还要关闭资源。

  • 注意:finally不能单独使用

多异常的捕获处理:

  • 多个异常分别处理
  • 多个异常一次捕获,多次处理
  • 多个异常一次捕获一次处理

finally有return语句:

  • 如果finally有return语句,永远返回finally中的结果,避免该情况。

异常注意事项-子父类异常:

  • 运行时异常被抛出可以不处理。即不捕获也不声明抛出。
  • 如果finally有return语句,永远返回finally中的结果,避免该情况.
  • 如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。
  • 父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出

自定义异常类:

  • Java提供的异常类,不够我们使用,需要自定义一些异常类