java程序的151个建议-提倡异常封装,采用异常链传递异常(代码片段)

你是我的天晴 你是我的天晴     2022-12-05     197

关键词:

Java语言的异常处理机制可以确保程序的健壮性,提高系统的可用率,但是Java API提 供的异常都是比较低级的(这里的低级是指“低级别”的异常),只有开发人员才能看得懂, 才明白发生了什么问题。而对于终端用户来说,这些异常基本上就是天书,与业务无关,是纯计算机语言的描述,那该怎么办?这就需要我们对异常进行封装了。异常封装有三方面的 优点:

(1)   提髙系统的友好性

例如,打开一个文件,如果文件不存在,则会报FileNotFoundException异常,如果该 方法的编写者不做任何处理,直接抛到上层,则会降低系统的友好性,代码如下所示:

public static void doStuffO throws Exception 

    InputStream is = new FileInputStreani("无效文件.txt");

    /*文件操作*/

此时doStuff方法的友好性极差:出现异常时(比如文件不存在),该方法会直接把 FileNotFoundException异常抛出到上层应用中(或者是最终用户),而上层应用(或用户) 要么自己处理,要么接着抛,最终的结果就是让用户面对着“天书”式的文字发呆,用户不知道这是什么问题,只是知道系统告诉他“哦,我出错了,什么错误?你自己看着办吧”。

解决办法就封装异常,可以把异常的阅读者分为两类:开发人员和用户。开发人员査找问题,需要打印出堆栈信息,而用户则需要了解具体的业务原因,比如文件太大、不能同时 编写文件等,代码如下:

public static void doStuff2() throwsMyBussinessException

    try 
        InputStream is = new FilelnputStream (n无效文件.txt"〉;
     catch (FileNotFoundException e) 
        //为方便开发和维护人员而设置的异常信息
         e.printstackTrace();
        //抛出业务异常
        throw new MyBussinessException (e);

(2)提高系统的可维护性 来看如下代码:

public void doStuff()
    try
            //do something
        catch(Exception e)
            e.printstackTrace();
        
    

这是很多程序员容易犯的错误,抛出异常是吧?分类处理多麻烦,就写一个catch块来 处理所有的异常吧,而且还信誓旦旦地说“JVM会打印出栈中的出错信息”,虽然这没错, 但是该信息只有开发人员自己才看得懂,维护人员看到这段异常时基本上无法处理,因为需要深入到代码逻辑中去分析问题。

正确的做法是对异常进行分类处理,并进行封装输出,代码如下:

public void doStuff()
    try
        //do something
    catch(FileNotPoiindException e) 

       log.info("文件未找到,使用默认釔置文件............. ");

    catch(SecurityException e)

        log.error "无权访问,可能原因是........... ");

        e.printStackTrace();
    

如此包装后,维护人员看到这样的异常就有了初步的判断,或者检査配置,或者初始化环境,不需要直接到代码层级去分析了^

(3)解决Java异常机制自身的缺陷

Java中的异常一次只能抛出一个,比如doStuff方法有两个逻辑代码片段,如果在第一 个逻辑片段中抛出异常,则第二个逻辑片段就不再执行了,也就无法抛出第二个异常了,现 在的问题是:如何才能一次抛出两个(或多个)异常呢?

其实,使用自行封装的异常可以解决该问题,代码如下:

class MyException extends Exception 
    //容纳所有的异常
    privateList<Throwable> causes = new ArrayList<Throwable>();
    //构造函数,传速一个异常列表
    public MyException(List<? extends Throwable> causes)  
        causes.addAll(causes);
        //读取所有的异常
        public Iist<Throwable> getExceptions()  
            return causes;
        
    


//MyExcepticm异常只是一个异常容器,可以容纳多个异常,但它本身并不代表任何异常含义,它所解决的是一次抛出多个异常的问题,具体调用如下:
public static void doStuffO throwsMyException 
    List<Throwable> list = new ArrayList<Throwable>();
    //第一个逻辑片段
     try 
        //Do Something     
     catch(Exception e)  
        list.add(e);
    

    //第二个逻辑片段 
    try 
        // Do Something
     catch(Exception e)  
        list.add(e);
    

    //检查是否有必要抛出异常 
    if (list.size() > 0) 
        throw new MyBxception(list);
    

这样一来,doStuff方法的调用者就可以一次获得多个异常了,也能够为用户提供完整 的例外情况说明。可能有读者会问:这种情况可能出现吗?怎么会要求一个方法抛出多个异常呢?

绝对可能出现,例如Web界面注册时,展现层依次把Usei•对象传递到逻辑层,Register 方法需要对各个Field进行校验并注册,例如用户名不能重复,密码必须符合密码策略等, 不要出现用户第一次提交时系统提示“用户名重复”,在用户修改用户名再次提交后,系统又提示“密码长度少于6位”的情况,这种操作模式下的用户体验非常糟糕,最好的解决办 法就是封装异常,建立异常容器,一次性地对User对象进行校验,然后返回所有的异常。

转载--编写高质量代码:改善java程序的151个建议(第3章:类对象及方法___建议36~40)

阅读目录建议36:使用构造代码块精简程序建议37:构造代码块会想你所想建议38:使用静态内部类提高封装性建议39:使用匿名类的构造函数建议40:匿名类的构造函数很特殊建议36:使用构造代码块精简程序  什么叫做代码块... 查看详情

编写高质量代码:改善java程序的151个建议-笔记

1、字母“l”作为长整形标志时务必大写。eg: long num=11L;2、3、4、 查看详情

编写高质量代码:改善java程序的151个建议-笔记

1、字母“l”作为长整形标志时务必大写。eg: long num=11L;2、3、4、 查看详情

编写高质量代码:改善java程序的151个建议--[52~64](代码片段)

编写高质量代码:改善Java程序的151个建议--[52~64]推荐使用String直接量赋值Java为了避免在一个系统中大量产生String对象(为什么会大量产生,因为String字符串是程序中最经常使用的类型),于是就设计了一个字符串池(也叫作字符串常... 查看详情

编写高质量代码:改善java程序的151个建议--[78~92](代码片段)

编写高质量代码:改善Java程序的151个建议--[78~92]HashMap中的hashCode应避免冲突多线程使用Vector或HashTableVector是ArrayList的多线程版本,HashTable是HashMap的多线程版本。非稳定排序推荐使用List对于变动的集合排序set=newTreeSet使用TreeSet是... 查看详情

改善java程序的151个建议--数组和集合

60、性能考虑,数组是首选,在基本类型处理方面。数组还是占优势的,并且集合类的底层也都是通过数组实现。建议在性能要求较高的场景中使用数组替代集合。61、假设有必要。使用变长数组:我们能够通过对数组扩容”婉... 查看详情

java提高:采用异常链传递异常

一、分析  异常需要封装,但是仅仅封装还是不够的,还需要传递异常。一个系统的友好型的标识,友好的界面功能是一方面,另一方面就是系统出现非预期的情况的处理方式了。二、场景  比如我们的JEE项目一般... 查看详情

转载---编写高质量代码:改善java程序的151个建议(第2章:基本类型___建议21~25)

阅读目录建议21:用偶判断,不用奇判断建议22:用整数类型处理货币建议23:不要让类型默默转换建议24:边界还是边界建议25:不要让四舍五入亏了一方                                ... 查看详情

java异常处理的十个建议(代码片段)

前言Java异常处理的十个建议,希望对大家有帮助~本文已上传github:https://github.com/whx123/JavaHome公众号:捡田螺的小男孩一、尽量不要使用e.printStackTrace(),而是使用log打印。反例:try//dowhatyouwantcatch(Exceptione)e.printStackTrace();正例:try//do... 查看详情

转载---编写高质量代码:改善java程序的151个建议(第2章:基本类型___建议26~30)

阅读目录建议26:提防包装类型的null值建议27:谨慎包装类型的大小比较建议28:优先使用整型池建议29:优先选择基本类型建议30:不要随便设置随机种子回到顶部建议26:提防包装类型的null值  我们知道Java引入包装类型(Wrapp... 查看详情

转载--编写高质量代码:改善java程序的151个建议(第5章:数组和集合___建议60~64)

阅读目录建议60:性能考虑,数组是首选建议61:若有必要,使用变长数组建议62:警惕数组的浅拷贝建议63:在明确的场景下,为集合指定初始容量建议64:多种最值算法,适时选择      噢,它明白了,河水既没有牛伯... 查看详情

转载--编写高质量代码:改善java程序的151个建议(第4章:字符串___建议52~55)

阅读目录建议52:推荐使用String直接量赋值建议53:注意方法中传递的参数要求建议54:正确使用String、StringBuffer、StringBuilder建议55:注意字符串的位置回到顶部建议52:推荐使用String直接量赋值  一般对象都是通过new关键字生... 查看详情

转载--编写高质量代码:改善java程序的151个建议(第5章:数组和集合___建议65~69)

阅读目录建议65:避开基本类型数组转换列表陷阱建议66:asList方法产生的List的对象不可更改建议67:不同的列表选择不同的遍历算法建议68:频繁插入和删除时使用LinkList建议69:列表相等只关心元素数据回到顶部建议65:避开基... 查看详情

转载--编写高质量代码:改善java程序的151个建议(第3章:类对象及方法___建议31~35)

阅读目录建议31:在接口中不要存在实现代码建议32:静态变量一定要先声明后赋值建议33:不要覆写静态方法建议34:构造函数尽量简化建议35:避免在构造函数中初始化其它类                  书读的多... 查看详情

关于java异常基础知识/编码经验的一些总结(代码片段)

...学习的知识。《EffectiveJava》、《编写高质量代码(改善Java程序的151个建议)》这两本书为方向进行整理。笔记立足DevOps。开发+运维+测试三个方向 查看详情

转载---编写高质量代码:改善java程序的151个建议(第3章:类对象及方法___建议47~51)

阅读目录建议47:在equals中使用getClass进行类型判断建议48:覆写equals方法必须覆写hashCode方法建议49:推荐覆写toString方法建议50:使用package-info类为包服务建议51:不要主动进行垃圾回收回到顶部建议47:在equals中使用getClass进行... 查看详情

转载----编写高质量代码:改善java程序的151个建议(第1章:java开发中通用的方法和准则___建议1~5)

阅读目录建议1:不要在常量和变量中出现易混淆的字母建议2:莫让常量蜕变成变量  建议3:三元操作符的类型务必一致 建议4:避免带有变长参数的方法重载建议5:别让null值和空值威胁到变长方法      ... 查看详情

转载---编写高质量代码:改善java程序的151个建议(第3章:类对象及方法___建议41~46)

阅读目录建议41:让多重继承成为现实建议42:让工具类不可实例化建议43:避免对象的浅拷贝建议44:推荐使用序列化对象的拷贝建议45:覆写equals方法时不要识别不出自己建议46:equals应该考虑null值情景回到顶部建议41:让多重... 查看详情