java异常处理笔记

异常的分类:

java.lang.Throwable 是java中所有错误或异常的超类。

Exception:编译期异常、RuntimeException 运行期异常。

Error:错误

 

处理异常的方式:

1、抛出异常throws,给jvm处理,异常中断后程序中断。

2、捕获异常try..catch,异常捕获后接着执行后续代码。

异常产生的过程:

main方法里,调用方法1,方法1里访问数组元素arr[3],如果越界,jvm就会检测出程序会出现异常。

jvm会做2件事情:

 a、JVM会根据异常产生的原因创建一个异常对象,这个异常对象包含了一次产生的(内容、原因、位置)

       new ArrayIndexOutOfBoundsException(“3”)

b、被调用的方法中,如果没有异常的处理逻辑(指try..catch),那么JVM会把异常对象抛出给方法的调用者(main方法)来处理这个异常。main方法也处理不了,就交给了JVM处理。

c、JVM会在控制台打印异常对象(内容、原因、位置),并且终止正在执行的java进程,中断处理。

举例如下:

 

 异常的处理:

0、throw关键字

      注意:a、throw关键字必须写在方法的内部。

                b、throw关键字后面new的对象必须是Exception或Exception的子类对象。

                c、throw关键字抛出的异常对象,我们必须处理这个异常对象。
                      throw后创建的是运行期异常:RuntimeException或RuntimeException子类对象,我们可以不处理,交给jvm处理(打印异常对象,中断程序)
                      throw后创建的是编译异常(写代码时报错,例如FileNotFoundException,IOException属于编译异常),必须处理这个异常,要么throws,要么try..catch

 

举例: 方法入参校验,如果方法入参有数组,这个数组碰巧是null,那就throw NullPointException(NullPointException属于运行期异常,可以不处理,自动交给jvm中断)

           索引<0或>数组的最大索引,也会抛出异常ArrayIndexOutOfBoundsException(属于运行期异常,可以不处理,自动交给jvm中断)

使用技巧:判断一个入参对象是否为空,直接调用Objects.requireNonNull(对象名,"异常信息提示")

 1、throws声明异常关键字  ,交给别人处理异常

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

      抛出的异常与声明的异常要一一对应。

      修饰符 返回值类型  方法名(参数列表) throws AAException,BBException..{

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

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

       ...

       }

     注意: 

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

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

            3、方法内部如果抛出了多个异常对象,那么throws后边也必须声明多个异常。 如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可。(FileNotFoundException,IOException,Exception父类,这三个只要声明Exception)

            4、方法A调用了一个声明抛出异常的方法B,就必须处理声明的异常。要么继续使用throws声明抛出,交给方法的调用者处理,最终交给jvm;要么try..catch处理异常。

            5、因为异常被jvm中断处理,异常之后的代码不会被执行

 

2、try...catch,自己处理异常

           try{

              可能出现异常的代码

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

              }

            catch(异常类型  变量名){

              }

       注意:

            1、try可能出现多个异常对象,可以使用多个catch处理这些异常。

            2、如果try中产生了异常,就会执行catch中的异常处理逻辑,执行完catch中的处理逻辑,继续执行catch之后的代码。如果try中没产生异常,就不执行catch中的代码,直接执行catch之后的代码。

            3、try中抛出什么异常对象,catch就定义什么样的异常变量,用来接收这个异常对象。

 

Throwable处理异常的三个方法

public string getMessage();

public string tostring();

public void printStackTrace();默认方法,信息最全面。

finally代码块

无论是否出现异常都会执行。

   注意:

      1、finally一般用于资源释放,无论程序是否异常,最后都要执行释放。

      2、finally不能单独使用,必须和try一起使用。

 

多个异常一个try捕获,多次catch处理:catch里定义的异常变量如果有子父类关系,那么子类的异常变量必须写在最上面,否则会报错。

多个异常多个try捕获,多次catch处理

多个异常一个try捕获,一次catch处理

 

 

 

posted @ 2021-03-09 20:36  左铭右想  阅读(76)  评论(0编辑  收藏  举报