Java异常的分类、抛出异常、自定义异常、注意问题等

一、异常的类型

Throwable是所有异常的根,java.lang.Throwable 

  • Error:

Error是错误即java.lang.Error ,表示不可恢复的错误,不可以捕捉

a、表示由JVM所侦测到的无法预期的错误

b、由于这是属于JVM层次的严重错误 ,导致JVM无法继续执行,因此无法捕捉到也无法采取任何恢复的操作。

c、Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形,一般是由虚拟机抛出

d、假如出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。

  • Exception:

Exception是异常即java.lang.Exception,表示可恢复的异常,这是可捕捉到的.分为运行时异常即runtime exception,检查性异常即checked exception.

  • checked异常:

Java异常的分类、抛出异常、自定义异常、注意问题等_第1张图片

Java异常的分类、抛出异常、自定义异常、注意问题等_第2张图片

如IO异常和SQL异常都是这种异常。 对于这种异常, JAVA编译器强制要求我们必需对出现的这些异常进行catch 。 这类异常并非程序本身的错误,而是在应用环境中出现的外部错误,,例如读取数据时已经超过了文件数据的长度等

  • runtime exception

Java异常的分类、抛出异常、自定义异常、注意问题等_第3张图片

a、我们可以不处理运行时的异常,当出现这样的异常时,总是由虚拟机接管。

b、出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。

c、如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。

d、抛出之后,因为异常的存在,会导致线程退出,如果是主程序,那么意味着整个程序终止运行。

e、运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。

言而总之,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。

二、异常的抛出

  • throw :

将产生的异常抛出,抛出的既可以是异常的引用,也可以是异常对象。

  • throws :

如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws声明抛出异常。 一个方法不处理这个异常,而是调用层次向上传递,谁调用这个方法,这个异常就由谁来处理。

如下图所示

Java异常的分类、抛出异常、自定义异常、注意问题等_第4张图片

注意:

关于抛出异常后,剩余代码是否还会继续执行

  • throws

对于throws向上抛出的情况,throw new Exception()之后的代码不会继续执行

//代码1
public static void test() throws Exception  {

    throw new Exception(""); 
    System.out.println("不可达代码"); 
}
  • throw

对于try...catch捕捉的异常,throw new Exception()之后的代码不会继续执行,但finally中的代码执行完后,其余代码依然会执行

try{
    throw new Exception(); 
}catch(Exception e) {
    e.printStackTrace();
}finally{
    System.out.println("无论何种情况,finally中的代码都会执行");
}
System.out.println("try...catch快之外的代码");

三、自定义异常

在Java中要想创建自定义异常,需要继承Throwable或者他的子类Exception。

class  自定义异常类 extends 异常类型(Exception){

 // 因为父类已经把异常信息的操作都完成了,所在子类只要在构造时,将异常信息传递给父类通过super 语句即可。
  // 重写 有参 和 无参  构造方法
}
public class CustomException extends Exception {

    //无参构造方法
    public CustomException(){super();}

    //有参的构造方法
    public CustomException(String message){super(message);}

    // 用指定的详细信息和原因构造一个新的异常
    public CustomException(String message, Throwable cause){super(message,cause);}

    //用指定原因构造一个新的异常
     public CustomException(Throwable cause) {super(cause);}

}

四、举个栗子

错误码接口

public interface ErrorCode {
    String getCode();
    String getDescription();
}

枚举类

public enum BizErrorCodeEnum implements ErrorCode { 
    /** 未指明的异常 */
    UNSPECIFIED("500", "网络异常,请稍后再试"),
    NO_SERVICE("404", "网络异常, 服务器熔断"),
    // 通用异常
    REQUEST_ERROR("400", "入参异常,请检查入参后再次调用"),
    PAGE_NUM_IS_NULL("4001","页码不能为空"),
    PAGE_SIZE_IS_NULL("4002","页数不能为空"),
    ID_IS_NULL("4003","ID不能为空"),
    SEARCH_IS_NULL("4004","搜索条件不能为空"),
    // 短信相关
    SEND_MASSAGE_FAIL("30001","发送短消息失败"),
    SEND_MASSAGE_OFTEN("30002","操作发送短消息太频繁,请稍后再试"),
    MESSAGE_TEMPLATE_UNDEFINED("30003","短信模板未定义"), 
    //支付相关
    CREATE_PAY_ORDER_FAIL("40001","创建订单支付失败"),
    UPDATE_PAY_ORDER_FAIL("40002","更新支付订单失败"),
    DEL_PAY_ORDER_FAIL("40003","更新支付订单失败"),
    PAY_ORDER_NO_EXISTS("40004","支付订单不存在"),
    REFUND_APPLY_NO_EXISTS("40005","退款申请不存在"),
    VERIFY_NOT_PASS("40006","验签"),
    RES_FAIL("40007","响应失败"),
    PAY_CHANNEL_IS_NULL("40008","支付渠道不能为空"),
    PAY_CHANNEL_PARAM_ERROR("40009","支付订单渠道参数错误"),;
    private final String code;
    private final String description;
    private BizErrorCodeEnum(final String code, final String description) {
        this.code = code;
        this.description = description;
    }
 
    根据编码查询枚举。
    public static BizErrorCodeEnum getByCode(String code) {
        for (BizErrorCodeEnum value : BizErrorCodeEnum.values()) {
            if (StringUtils.equals(code, value.getCode())) {
                return value;
            }
        }
        return UNSPECIFIED;
    }
判断枚举类是否包含错误码
    public static Boolean contains(String code){
        for (BizErrorCodeEnum value : BizErrorCodeEnum.values()) {
            if (StringUtils.equals(code, value.getCode())) {
                return true;
            }
        }
        return  false;
    }
    public String getCode() {
        return code;
    }
    public String getDescription() {
        return description;
    }
}

自定义异常类

public class BizException extends RuntimeException { 
    private static final long serialVersionUID = -7864604160297181941L;
    protected final ErrorCode errorCode;
无参构造默认异常
    public BizException() {
        super(BizErrorCodeEnum.UNSPECIFIED.getDescription());
        this.errorCode = BizErrorCodeEnum.UNSPECIFIED;
    }
传入枚举
    public BizException(final ErrorCode errorCode) {
        super(errorCode.getDescription());
        this.errorCode = errorCode;
    }
自定义异常描述
    public BizException(final String detailedMessage) {
        super(detailedMessage);
        this.errorCode = BizErrorCodeEnum.UNSPECIFIED;

    public ErrorCode getErrorCode() {
        return errorCode;
    }
 
 
}

 

 

 

 

 

 

 

 

 

 

 

 


 

你可能感兴趣的:(javaText)