java代码整洁之道(二)如何自定义异常

java代码整洁之道(二)_如何自定义异常

首先解释下java异常:当程序出现错误,异常给程序一个安全的退出,出现异常改变程序原有的流程,将控制权移交给异常处理器。

异常结构(类图)

在这里插入图片描述throwable 的子类有两个实现类Error,Exception ,throwable java指代的一种通过异常传播机制的共性

1.其中ERROR 程序的无法处理的错误,和程序员日常编码无关系的,它们在应用程序的控制和处理能力之外
如:VirtualMachineError 虚拟机错误,内存溢出 outOfMemoryError, 线程死锁 ThreadDeath

2.其中Exception,是指程序可以处理的异常, 程序中的异常这个和程序员日常编码息息相关

(1)运行时异常 runtimeException :怎么解释这个异常那,就是程序运行起来会发生的异常,换句话说就是程序不达到某种情况一辈子也可能抛不出来的异常,常见的运行时异常有(空指针异常 NullPointerException,数组下标越界异常 ArrayIndexOutOfBoundsException,算数异常 ArithmeticException, 类型转换异常 ClassCastException),画重点运行时异常的特点是Java 编译器不会检查它,即使不用try catch 语句捕获它,它没有throws 子语句声明抛出它,它也能编译通过的

(2)非运行时异常: 这个怎么说,就是运行时异常之外的异常都是非运行时异常,如常见的异常 IO 异常 IOException类型转换异常 ClassCastException画重点必须显示的try catch,或者throws


为什么要创建自己的异常,我的理由是这样的
(1)业务代码中常常需要阻断流程,而且直接抛出throw new Exception() 也不合适。参考java 代码整洁之道 中的短路写法,用自定义异常很好的处理异常结果。
(2)处理一些非运行异常常导致try catch 漫天非,代码非常不友好,用自定义异常能方便的进行非运行时异常运行时异常,方便异常的统一处理。
(3)自定义异常能更清楚的说明异常情况。


如何自定义异常

public class ServiceException extends  RuntimeException {

    public ServiceException(String msg){
        super(msg);
    }
}

上面的代码继承了RuntimeException ,当然继承Exception 区别在与我在这想写一个业务异常,runtimeException 不会显现的throws 或者 try{}catch(){}

下面继续完善我的业务自定义异常

public class ServiceException extends  RuntimeException {
    private int code;
    private String errorMsg;
    
    private ServiceException(String msg){
        super(msg);
    }
    
    public ServiceException(int code,String errorMsg ,String msg){
        super(msg);
        this.code = code;
        this.errorMsg = errorMsg;
    }

总结下: 当程序遇到业务类型异常流程是否可以采用自定义异常的方式退出那?和同事讨论了半天,依然很艰难得出一个结果,心里也纠结的要命,看一点源码
ArrayList

 @Override
    public void forEach(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        final int expectedModCount = modCount;
        @SuppressWarnings("unchecked")
        final E[] elementData = (E[]) this.elementData;
        final int size = this.size;
        for (int i=0; modCount == expectedModCount && i < size; i++) {
            action.accept(elementData[i]);
        }
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
    }

其中 ConcurrentModificationException 就是一个RuntimeException , 触发场景就是一个,当并发时 使得 modCount 和 expectedModCount 不等,用于退出程序
在此处可以看出来,这个异常用作不期待结果的退出。当业务也常是否可用业务的不期待结果(如 参数校验失败,结果不符合预期)的退出有待于考证。希望看到的同学给我解答. 咨询了下以前的领导,似乎自己明白了,


要克服生活的焦虑和沮丧,得先学会做自己的主人,有问题留言,没问题留下你的赞
博客声明:
1.博客内容全是对工作学习的总结
2.知识点都经过测试和推敲,如有疑问请留言,一定及时解决

参考博客:
https://blog.csdn.net/qq_29229567/article/details/80773970

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章