终于拿出压箱底的那本《Java编程思想》。这本书我年轻的时候就买了,可是翻过几页后就放弃了。没想到这两天翻了一下,真的有收获。
看了一下第12章异常,有两个地方令我感悟很深。java
public static void main(String[] args) { try{ InputFile in = new InputFile("Test01.java"); try{ String s; int i = 1; while (Objects.nonNull(s=in.getLine())){ System.out.println(s); //todo } }catch (Exception e){ System.out.println("catch exception in main"); e.printStackTrace(); }finally { in.dispose(); } }catch (Exception e){ System.out.println("construct InputFile error"); } } }
** 处理构造可能失败,而且须要清理的对象 **,每一个构造都必须包裹在本身的try-finally语句块,而且每一个对象构造器以后都必须跟随一个try-finally语句块,确保本身可以被正确地清理。
上面这个就是咱们工做中处理网络链接、redis链接、IO文件链接的基本原型,看似平常,可是须要谨记(对我而言尤为是,毕竟有过redis链接忘记释放耗尽链接池致使用户登陆不进来的惨痛经历)程序员
这个是在第四版的12.12 其余可选方式 这章讲述的。印象很深,由于我历来没有思考过,Java异常设计的是否合理,没有质疑过它的正确性。可是做者却认为,"被检查的异常"强制程序员在没有作好准备的状况下被迫加上catch语句,这个致使"吞食则有害"的问题。就是说咱们常常在catch中不处理异常或者不清楚如何处理,错误地处理了异常,而不是将异常抛出来。
这个问题我在项目中的代码也常常看到,程序返回的结果不是咱们想要的,可是却没有找到异常日志,复查代码的时候才发现,有catch语句"吞食"了异常。
虽然代码编程规范告诉咱们要抛出异常,可是为何必定要这么作?期待程序员的自律,不如不给"吞食"的机会。
异常设计的初衷,我想就如做者所说,是为了跟方便地编程,写C的时候,你不知道哪里出了问题,只能借助调试器一步步地debug,可是Java的异常机制可让咱们放心地编程,由于异常机制会帮咱们查找出出错的位置。可是"被检查的异常"有点违背这个初衷,彷佛给了一条隐藏残缺的捷径。
千万不要吞食异常,抛出来redis
观点不必定正确,毕竟人的认知是不断改变的,欢迎探讨和指正。编程