Java中异常的基础介绍

1.异常的概念&异常体系

异常,指的是程序在执行过程中出现的非正常的情况,最终会导致JVM非正常停止。

在Java中,异常本身就是一个类。

Java处理异常的方式是中断处理。

异常指的不是语法错误,语法错了,编译就不能通过,也不会产生字节码文件,根本不能运行。

异常的根类是java.lang.Throwable,其下有两个子类:

java.lang.Exception和java.lang.Error

平常说的异常指的是Exception。

Error是工程师不能处理的,只能尽量避免;

Exception是由于使用不当导致,是可以避免的。

2.异常的分类

Exception是在编辑编译期异常,在进行编辑编译(写代码)时Java程序出现的问题。

RuntimeException是运行期异常,Java程序在运行过程中出现的问题。

Exception是异常,而Error是错误。

异常就相当于有了一个小毛病(相当于人体的感冒,发烧),把异常处理后,程序能够继续执行(吃点感冒药好了后能够继续生活)。

错误就相当于程序患有一个无法治愈的疾病(如艾滋,非典),必须修改源代码程序才能继续执行。

3.异常的处理过程解析

假设在一个索引最大为2的数组中访问了索引为3的位置,则会出现索引越界异常(new ArrayIndexOutOfBoundsException("3");),异常的处理过程如下:

访问了数组中的3索引,而数组是没有3索引的,这时候jVM就会检测出程序会出现异常
JVM会做两件事情:
1).JVM会根据异常产生的原因创建一个异常对象 ,这个异常对象包含了异常产生的(内容,原因,位置)
new ArrayIndexOutOfBoundsException("3");
2).在异常出现的那个方法中,没有异常的处理逻辑(ry-.catch),那么JVM就会把异常对象抛出给方法的调用者
main方法来处理这个异常

main方法接收到了这个异常对象main方法也没有异常的处理逻辑

继续吧对象抛出给main方法的调用者JVM处理

JVM接收到了这个异常对象做了两件事情
1).把异常对象(包含内容,原因,位置)以红色的字体打印在控制台
2).JVM会终止当前正在执行的java程序-->中断处理

4.throw关键字

throw关键字都作用:可以使throw关键字在指定的方法中,抛出指定的异常。

使用格式:

      throw new XXXException(“异常产生的原因”)

注意:

1).throw关键字必须写在方法的内部。

2).throw关键字后边的new的对象必须是Exception或者Exception的子类对象。

3).throw关键字抛出的指定的异常对象,就必须处理这个异常。

  throw关键字后边创建的是RuntimeException或者RuntimeException的子类对象,我们可以不处理,默认交给JVM处理(打印异常类对象中断程序)

  throw关键字后边创建的是编译异常(写代码的时候报错),我们就必须处理这个异常,要么throws,要么try...catch。

以后(工作中)我们首先必须对方法传递的参数进行合法性校验。

如果参数不合法,那么我们就必须用抛出异常的方式,告知方法的调用者,传递的参数有问题。

空指针异常,索引越界异常都是运行期异常,对于运行期异常,我们都不用处理,默认交给JVM处理。

5.Objects的非空判断

Objects中的静态方法:

      public static <T> T requireNOnNull(T obj):查看指定引用对象不是NULL。

源码如下:

      public static <T> T requireNonNull(T obj){

          if(obj == null)

            throw new NullPointerException();

              return obj;}

6.throws关键字(注意:和第四点不同)

throws关键字:异常处理的第一种方式,交给别人处理。

作用:

当方法内部抛出异常对象时,那么就必须处理这个异常对象。

可以使用throws关键字处理异常对象,会把异常会把异常对象声明抛出给方法的调用者处理(给别人处理,自己不处理),最终交给JVM处理--->中断处理。

使用格式:在方法声明时使用

      修饰符 返回值类型 方法名(参数列表)throws AAAException,BBBException

      {

          throw new AAAException(“产生原因”);

          throw new BBBException(“产生原因”);

          ...

       }  

注意:

1).throws关键字必须写在方法声明处。

2).throws关键字后边声明的异常必须是Exception或者是Exception的子类。

3).方法内部如果抛出了多个异常对象,那么throws后边必须也声明多个异常。如果抛出了多个异常对象有子父类关系,那么直接声明父类异常即可。

4).调用了一个声明抛出异常的方法,我们就必须处理声明的异常。要么继续使用throws声明抛出,交给方法的调用者,最终交给JVM;要么try...catch自己处理。

7.try...catch异常处理

这是Java中异常处理的第二种方式:自己处理。

格式:

      try{可能异常的代码

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

        异常处理的逻辑,接收异常对象之后,怎么处理对象,一般在工作中,会把异常记录在一个日志中}

      ...

       catch(异常类名 变量名){处理逻辑}

注意:

1).try中可能抛出多个异常,那么就可以使用多个catch来处理这些异常。

2).如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try...catch之后的代码。

  如果try...catch中没有产生异常,那么就不执行catch中异常的处理逻辑,执行完try中的代码,继续执行try...catch后的代码。

8.finally代码块

在finally中的代码,无论是否有异常产生,都将会执行。

使用方法:直接写在try...catch之后即可

      try{可能异常的代码

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

        异常处理的逻辑,接收异常对象之后,怎么处理对象,一般在工作中,会把异常记录在一个日志中}

      ...

      catch(异常类名 变量名){处理逻辑

      }finally{“finally代码块”}

注意:

1).finally不能单独使用,必须和try...catch一起使用。

2).finally一般用于资源释放(资源回收),无论程序是否出现异常,最后都要资源释放(IO)。

9.异常的注意事项

1).多异常的捕获与处理

在多个异常捕获时如何处理?

分为三种处理方式:多个异常分别处理、多个异常一次捕获多次处理、多个异常一次捕获一次处理。

对多个异常一次捕获,分别处理需要注意:在catch里边定义的异常设置,如果有子父类关系,那么子类的异常变量必须写在上边,否则会报错。

运行时异常被抛出可以不处理,即不捕获也不声明抛出。

默认给虚拟机处理,终止程序,什么时候不抛出运行时异常了,再来继续执行程序。

2).finally有return语句

如果finally有return语句,那么永远返回的都是finally中的结果,需要避免该情况。

3).子父类异常

如果父类抛出了多个异常,子类重写父类的方法时,只能抛出和父类相同的异常或是父类异常的子类或者不抛出异常。

父类方法没有抛出异常,子类重写父类该方法时,也不可以抛出异常,此时,子类产生该异常,只能是捕获处理,不能声明抛出。

即:父类异常是什么样,子类异常就是什么样。

10.自定义异常类

java提供的异常类,不够我们使用,需要自己定义一些异常类
格式:
      public CLass XXXExcepiton extends Exception | Runt imeException{
          添加一个空参数的构造方法
          添加一个带异常信息的构造方法

        }

注意:
1.自定义异常类一般都是以Exception结尾,说明该类是一个异常类。
2.自定义异常类,必须的继承Exception或者RuntimeException。
继承Exception:那么自定义的异常类就是一个编译期异常 ,如果方法内部抛出了编译期异常,就必须处理这个异常,要么throws, 要么try...catch
继承RuntimeException:那么自定义的异常类就是一个运行期异常 ,无需处理,交给虚拟机处理(中断处理)。

posted @ 2020-08-18 22:53  9_金先生  阅读(140)  评论(0)    收藏  举报