Java中的异常

异常

概述:程序在执行中遇到非正常情况(非语法错误)导致JVM停止运行。异常本身是一个类,产生异常就是创建异常对象并抛出,Java中处理异常的方式是中断。

异常体系

异常机制本质是帮助我们找出程序中的问题,根类是java.lang.Throwable,其下两个子类是ErrorException,前者必须修改代码程序才能继续执行,后者是由于使用不当导致,可以避免。Exception一般指编译期异常,指代码编译时出现的问题,而它的特殊子类RuntimeException指运行期异常。

异常处理

常用关键字:try,catch,finally,throw,throws

  1. 抛出异常:throw

    • 作用:用在方法内,抛出一个指定的异常对象。将此对象传递到调用者处并结束当前方法的执行。在调用方法时,先对接收到的参数数据进行合法性校验,若其不合法,则以抛出异常的方式告诉调用者传递合法参数。
    • 格式:throw new XxxException(参数);//可为自己编写的提示信息
    • 注意:若创建的是RuntimeException或其子类对象,可默认交给JVM处理(红字体打印并中断);若throw关键字后创建的是编译异常对象(写代码时报错),我们就要通过throws声明抛出交给调用者处理或try...catch自己处理此异常。
  2. 声明异常:throws

    • 作用:将问题标识出来,报告给调用者。若方法内通过throw抛出了异常而没有进行捕获处理,则必须通过throws声明,交给调用者处理。

    • 格式:修饰符 返回值类型 方法名(参数)throws 异常类名1,异常类名2...{}

    • 注意:若方法内部抛出的多个异常对象间有继承关系,直接声明父类异常即可。

      当调定义了一个抛出编译异常的方法,则必须在该方法修饰符处使用throws关键字声明异常(Alt+Enter),在调用该方法的方法前也要作声明处理。

  3. 捕获异常:try...catch

    • 作用:通过声明抛出处理,程序碰到异常会立刻终止。因此需自己处理异常,定义碰到异常后的处理逻辑使得程序继续运行。

    • 格式:

      try{
          //可能产生异常的代码,调用带异常的方法等
      }catch(异常类型 变量名){  //用于接收异常对象
          //异常的处理逻辑,一般会把异常信息记录到日志中,可有多个catch
      }
      
    • 注意:捕获异常无需在调用时声明抛出,即未将方法中的异常声明给异常调用者,而是直接执行调用时的catch语句,因此只需在定义该方法时声明抛出异常即可。若想在catch后直接结束方法,return即可。

  4. Throwable类中3个异常处理方法

    • String getMessage()
      返回此异常对象的简短消息字符串。(异常产生原因)

    • String toString()
      重写了Object类的toString方法,返回略详细描述。(异常类型及原因)

    • void printStackTrace()

      JVM默认此方法打印异常对象,信息最详细包括异常产生位置、原因及内容。

  5. finally代码块:跟在try...catch语句之后,无论是否出现异常都会执行(try中代码发生异常后会直接跳到catch,后面的语句执行不到)。一般用于资源释放(回收)。

    • 格式:finally {}
常见异常分类
  • 运行期异常:

    1. 空指针异常NullPointerException

      Objects非空判断:通过Objects类中的静态方法requireNonNull查看传入的参数对象是否为空,是则抛出空指针异常,否则返回该对象。

    2. 数组索引越界异常ArrayIndexOutOfBoundsException

  • 编译期异常:

    1. 文件后缀名异常IOException.endwith获取文件后缀名。
    2. 文件查询异常FileNotFoundException,是上面异常的子类。
异常捕获处理注意事项
  • 多个异常分别处理

    顾名思义,对每个可能出现的异常都分别进行捕获和处理。

  • 一次捕获,多次(一次)处理,常用

    将可能出现的异常放在一个try中,在分别catch处理。需注意若catch里的异常变量有父子关系,则子类必须写在上面,不然报错。一次处理即只使用一个所有异常都可继承的父类异常捕获。

  • finally中应避免使用return语句,否则会永远返回finally中的结果。

  • 父子类异常:

    • 子类重写父类方法时,可抛出和父类相同的异常,或父类异常的子类,或者不抛出。
    • 父类方法没有抛出,子类重写时也不能抛出。若子类产生该异常,则只能捕获处理。
自定义异常类

格式:

public class XxxException extends Exception / RuntimeException{
   public XxxException(){
       super();
   }  //空参构造方法 
   public XxxException(String message){
       super(message);
   }  //带信息的构造方法,调用父类异常信息的构造方法 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值