一  处理原则

  Java异常代码中我们使用异常的目的是让异常的异常类型来提示“什么”被抛出了--- 即出了什么问题;用异常的栈打印信息来跟踪异常在“哪里”抛出 --- 即哪里出了问题;

  异常提示信息来提示“为什么”会抛出 --- 即出问题的原因。在对异常进行处理时,遵循以下原则可以有助于在调试过程中最大限度的使用好异常。

  1. 具体明确
  2. 提早抛出
  3. 延迟捕获

  1.具体明确

  具体明确指的是在抛出异常时需要针对具体问题来抛出异常,抛出的异常要足够具体详细;在捕获异常时需要对捕获的异常进行细分,这时会有多个catch语句块,这几个catch块中间泛化程度越低的异常需要越放在

  前面捕获,泛化程度高的异常捕获放在后面,这样的好处是如果出现异常可以近可能得明确异常的具体类型是什么。

  例如 FileInputStream 的一个构造方法如下, 对file对象做检查后判断file是否有效,如果无效直接抛出FileNotFoundException,而不是IOException或者其他更宽泛的Exception

    public FileInputStream(File file) throws FileNotFoundException {String name = (file != null ? file.getPath() : null);SecurityManager security = System.getSecurityManager();if (security != null) {security.checkRead(name);}if (name == null) {throw new NullPointerException();}if (file.isInvalid()) {throw new FileNotFoundException("Invalid file path");}fd = new FileDescriptor();fd.attach(this);path = name;open(name);}

  同样的,在对异常做捕获处理时,也需要做到具体明确,以下try语句块中read()和close方法均会抛出IOException而FileInputStream()抛出的是FileNotFoundException

  事实上FileNotFoundException继承自IOException,用一个IOException 就可以囊括所有的异常,这里仍然使用了两个catch块来分别捕获,为的就是方便定位异常问题。

    public void foo1(String fileName){File file = new File(fileName);InputStream in = null;try {in = new FileInputStream(file);Integer num = in.read();in.close();} catch (FileNotFoundException e) {e.printStackTrace();}catch (IOException e){e.printStackTrace();}}

  2.提早抛出

  提早抛出的基本目的还是为了防止问题扩散,这样出现异常的话排查起来会比较耗时,比较典型的一种情况是 NPE(NullPointerException),当某个参数对象为null时,如果不提早判断并抛出异常的话,这个null可能

  会藏的比较深,等到出现NPE时就需要往回追溯代码了。这样就给排查问题增加了难度。所以我们的处理原则是出现问题就及早抛出异常。

  例如 上面FileInputStream 的构造方法,在使用前就对File 的path做了判断,如果为null 就及早的抛出NullPointerException,防止在后面open方法中传入一个null,从而简化了出现异常的情况,方便定位问题。

  3.延迟捕获

  延迟捕获说的是对异常的捕获和处理需要根据当前代码的能力来做,如果当前方法内无法对异常做处理,即使出现了检查异常也应该考虑将异常抛出给调用者做处理,如果调用者也无法处理理论上他也应该继续上抛,

  这样异常最终会在一个适当的位置被catch下来,而比起异常出现的位置,异常的捕获和处理是延迟了很多。但是也避免了不恰当的处理。

  二  处理技巧

  对于异常的处理,能避免的异常,尽量在事先做判断来避免异常的发生,当判断时发现逻辑上已经不能往下走了,需要停止流程,这时候将异常抛出并准确的提示使用者问题所在。

  对于事先无法预判的异常需要对其进行处理。

  异常分运行时异常 RuntimeException 和 检查异常Checked Exception,运行时异常一般用在由于接口方法使用不当的时候

  如: 使用了null获取属性方法, 数组下标越界,除法运算除以0等

  • 如果你调用服务方法的方式不正确,你应该马上修改代码,避免发生RuntimeException
  • 如果是用户方法调用你的方法的方式不正确,你应该立刻抛出RuntimeException,强制让使用者修正代码或改变使用方式,防止问题蔓延
  • 一般情况下,不要捕获或声明RuntimeException,需要做的是完善程序代码。因为问题在于你的程序本身有问题,如果你用异常流程处理了,反而让正常流程问题一直存在

  对于检查异常,一般先看能不能处理,能处理的异常使用try-catch 语句块捕获处理,不能处理使用throws 分类型抛出给上一级处理

  使用try-catch语句块处理时一般需要注意以下几方面

  1. try语句块内要分清稳定代码和非稳定代码,对于稳定的不会出现异常的代码不要放到try语句块中
  2. catch捕获的异常一定要处理
  3. 若使用了finally 语句块,在语句块内一定要对资源对象,流对象进行关闭(jdk1.7之后 可以使用try-with-resources替代)
  4. finally中不要使用return语句,因为finally语句块最后一定会执行,这里的return语句会覆盖之前的return语句

  参考:

  [1] 有效处理javay异常的三个原则

  [2] 阿里巴巴Java开发手册

转载于:https://www.cnblogs.com/mingorun/p/8900449.html

Java异常处理原则与技巧总结相关推荐

  1. Java基础学习总结(123)——Java异常处理原则

    在Java开发过程中,见过很多人在进行异常处理的时候,直接一个 e.printStackTrace() 就完成了,这是一种非常粗陋的做法,首先会导致应用日志的大量错误信息,而很多时候你都不知道这些错误 ...

  2. 【转载】Java异常控制机制和异常处理原则

    转载自Java异常控制机制和异常处理原则 Java异常控制机制又被称为"违例控制机制". 捕获程序错误最理想的时机是在编译阶段,这样可以彻底避免错误的代码运行.但并非所有的错误都能 ...

  3. Java 异常处理的 9 个最佳实践

    Java 异常处理的 9 个最佳实践 原文地址:https://dzone.com/articles/9-... 翻译出处:https://www.oschina.net/trans... 在 Jav ...

  4. Java异常处理总结

    Java异常处理总结           异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制 ...

  5. Java程序员从笨鸟到菜鸟之(十二)java异常处理机制

    异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出 ...

  6. 【java】Java异常处理总结

    java方法中,代码抛出异常,如果没有catch和finally语句,则直接跳出方法,不执行异常代码后面的代码. 若有catch并捕获了异常,则执行catch代码块.若没有捕获,就跳出方法. 若有fi ...

  7. Java 异常处理 try catch

    一:try catch是什么 try catch是java程序设计中处理异常的重要组成部分 异常是程序中的一些错误,有些异常需要做处理,有些则不需要捕获处理,异常是针对方法来说的,抛出.声明抛出.捕获 ...

  8. Java异常处理12条军规

    摘要: 简单实用的建议. 原文:Java异常处理12条军规 公众号:Spring源码解析 Fundebug经授权转载,版权归原作者所有. 在Java语言中,异常从使用方式上可以分为两大类: Check ...

  9. 异常处理原则--good

    异常机制是现代主流语言的标配,但是异常处理问题虽然已经被讨论很多,也有很多经典书籍的论述,却一直都充满争议.很多人都觉得异常处理很难拿捏,同时也难以理解一些语言或库的异常处理设计.我使用Java近10 ...

最新文章

  1. WebStorm 运行Rect Native 项目
  2. opencv 裁剪 java_如何在opencv java中裁剪检测到的面部图像
  3. 生产排期混乱、质量问题难定位?这套生产场景方案全解决,附模板
  4. 耳机使用说明书 jbl ua_JBL UA联名款,全新一代真无线运动耳机“UA小黑盒”今日天猫首发...
  5. 7z文件格式及其源码的分析(二)
  6. TortoiseSVN右键没有菜单
  7. Win10 64位+Mysql5.7+主从同步配置
  8. 大学计算机课桌面弄毛玻璃,高校换上新课桌,同学表示“世界观被颠覆”,网友:黑科技的诞生...
  9. 打破墨守成规的思维模式,你才能挣到钱
  10. C语言,十进制转化为二进制。
  11. JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialize
  12. 空间点到直线距离的一种解法
  13. 相邻位数字差值的绝对值不能超过77_微信小程序直播怎么用和挣钱?4位内测CEO答5大关键问题...
  14. 网络抓包工具 翻译帮助文档 详解教程
  15. 120个微信小程序源码
  16. 用java将数组中的数字倒过来_有数组a[n],用java 代码将数组元素顺序颠倒
  17. 蒋鑫鸿:9.9黄金交替洗盘,日内黄金行情走势分析白银原油操作建议
  18. 王慧文复出进军人工智能,王兴投资BlockCity区块城市搞元宇宙
  19. VSCode 配置远程登入 Remote-SSH
  20. ppst技术视频—— nginx ubuntu安装使用

热门文章

  1. linux的xmgrace无法运行,科学网—安装xmgrace - 林绪波的博文
  2. MQTT客户端库-Paho GO
  3. 大二《数据结构》机考解题报告
  4. 和菜鸟一起深入学习国嵌实验之简单Makefile
  5. mysql往前一天同一时间_Mysql时间轴数据 获取同一天数据的前三条
  6. head first java原文_Head First Java
  7. 银行系统日终结算要多久_美股顽强翻红!两连跌终结,联储降息预期已超九成!制造业疲软消费者信心坚挺,三大股指又假摔?...
  8. 第一部分 Java:面向对象理解
  9. IDEA中导入支付宝电脑网站支付测试Demo遇到的错误
  10. monaco-editor 监听保存按钮