来源:Lrwinlrwinx.github.io/2016/04/28/如何优雅的设计java异常/

导语

异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问,笔者根据自己的开发经验来谈一谈我是如何对异常进行处理的。

由于本文只作一些经验之谈,不涉及到基础知识部分,如果读者对异常的概念还很模糊,请先查看基础知识。

如何选择异常类型

异常的类别

正如我们所知道的,java中的异常的超类是java.lang.Throwable(后文省略为Throwable),它有两个比较重要的子类,java.lang.Exception(后文省略为Exception)和java.lang.Error(后文省略为Error),其中Error由JVM虚拟机进行管理,如我们所熟知的OutOfMemoryError异常等,所以我们本文不关注Error异常,那么我们细说一下Exception异常。

Exception异常有个比较重要的子类,叫做RuntimeException。我们将RuntimeException或其他继承自RuntimeException的子类称为非受检异常(unchecked Exception),其他继承自Exception异常的子类称为受检异常(checked Exception)。本文重点来关注一下受检异常和非受检异常这两种异常。

如何选择异常

从笔者的开发经验来看,如果在一个应用中,需要开发一个方法(如某个功能的service方法),这个方法如果中间可能出现异常,那么你需要考虑这个异常出现之后是否调用者可以处理,并且你是否希望调用者进行处理,如果调用者可以处理,并且你也希望调用者进行处理,那么就要抛出受检异常,提醒调用者在使用你的方法时,考虑到如果抛出异常时如果进行处理,相似的,如果在写某个方法时,你认为这是个偶然异常,理论上说,你觉得运行时可能会碰到什么问题,而这些问题也许不是必然发生的,也不需要调用者显示的通过异常来判断业务流程操作的,那么这时就可以使用一个RuntimeException这样的非受检异常.

好了,估计我上边说的这段话,你读了很多遍也依然觉得晦涩了。

那么,请跟着我的思路,在慢慢领会一下。

什么时候才需要抛异常

首先我们需要了解一个问题,什么时候才需要抛异常?异常的设计是方便给开发者使用的,但不是乱用的,笔者对于什么时候抛异常这个问题也问了很多朋友,能给出准确答案的确实不多。其实这个问题很简单,如果你觉得某些”问题”解决不了了,那么你就可以抛出异常了。比如,你在写一个service,其中在写到某段代码处,你发现可能会产生问题,那么就请抛出异常吧,相信我,你此时抛出异常将是一个最佳时机。

应该抛出怎样的异常

了解完了什么时候才需要抛出异常后,我们再思考一个问题,真的当我们抛出异常时,我们应该选用怎样的异常呢?究竟是受检异常还是非受检异常呢(RuntimeException)呢?我来举例说明一下这个问题,先从受检异常说起,比如说有这样一个业务逻辑,需要从某文件中读取某个数据,这个读取操作可能是由于文件被删除等其他问题导致无法获取从而出现读取错误,那么就要从redis或mysql数据库中再去获取此数据,参考如下代码,getKey(Integer)为入口程序.

public String getKey(Integer key){ String value; try { InputStream inputStream = getFiles("/file/nofile"); //接下来从流中读取key的value指 value = ...; } catch (Exception e) { //如果抛出异常将从mysql或者redis进行取之 value = ...; }} public InputStream getFiles(String path) throws Exception { File file = new File(path); InputStream inputStream = null; try { inputStream = new BufferedInputStream(new FileInputStream(file)); } catch (FileNotFoundException e) { throw new Exception("I/O读取错误

受检异常 非受检异常_这样设计 Java 异常更优雅,赶紧学相关推荐

  1. java build path entries 为空_同事的代码简直没法看,我来教你如何更优雅的设计Java异常...

    点击上方蓝色字体,选择"设为星标" 回复"666"获取面试宝典 异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问,笔者根据自己的 ...

  2. struts2前台获取setattribute为空指针异常_告诉你,这样设计 Java 异常更优雅,更牛逼!...

    来源:Lrwin lrwinx.github.io/2016/04/28/如何优雅的设计java异常/ 导语 异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问,笔者根据 ...

  3. 教你如何更优雅的设计Java异常

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:lrwinx https://lrwinx.github.i ...

  4. 如何优雅的设计java异常

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:lrwinx https://lrwinx.github.i ...

  5. 如何优雅的设计 Java 异常

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:推荐 8 个常用 Spring Boot 项目个人原创+1博客:点击前往,查看更多 作 者:Lrwin 来 源: ...

  6. 面试官 | 如何优雅的设计Java 异常?

    作者 | lrwinx 来源 | lrwinx.github.io 异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问. 异常的类别 正如我们所知道的,java中的异常的 ...

  7. Java异常中受检异常非受检异常与RuntimeException异常关系

    Error 和 Exception: 所有异常都是 Throwable 的子类,分为 Error 和 Exception.Error 是 Java 运行时系统的内部错误和资 源耗尽错误,例如 Stac ...

  8. Java千百问_04异常处理(007)_常见的java异常有哪些(非运行时)

    1.常见的java运行时异常有哪些 了解非运行时异常看这里:什么是java中的异常  常见的运行时异常看这里:常见的运行时异常有哪些 我们所说的常见异常是jdk或者其他常用第三方jar中的异常,出现频 ...

  9. java异常原则_有效处理Java异常三原则

    Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮.易于调试.异常之所以是一种强大的调试手段,在于其回答了以下三个问题: 什么出了错? 在哪出的错? 为什么出错? ...

最新文章

  1. 【转】从网页上下载控件时制作CAB包的方法
  2. Javascript的作用域,作用域链,闭包
  3. ribbon客户端的负载均衡
  4. 牛客 - 交换(思维+找循环节)
  5. 谷歌Android无障碍套件,谷歌为无障碍套件添加盲文键盘:无需额外硬件就能打字...
  6. 【开源项目之路】jquery的build问题
  7. mysql中视图的概念_MySql中的视图的概念及应用
  8. 波拉契尔数列 C++
  9. uvm 形式验证_谈一谈IC flow中的形式验证
  10. 记录一次iOS11大标题不滚动的问题
  11. myeclipse中文界面改颜色_“颜色识别器”安卓APP功能详细介绍
  12. Maven学习五之Nexus中各repository介绍
  13. 禾川plc编程软件_HCP Works下载 HCP Works(禾川PLC编程软件) v2.26.01.92012 官方安装版 下载-脚本之家...
  14. Ubuntu20.04安装增强功能
  15. firefly-rk3288点mipi屏TV080WUM-NL0有显示无背光
  16. make_interp_spline(x, y[1:151])(x_smooth) ValueError: x and y are incompatible.
  17. 利用Fiddler抓包软件,爬短视频无水印,爬wei视app,步骤完整
  18. 计算机组成原理之指令微操作(简化总结)
  19. 【Linux】 常用命令
  20. 商用厨房设备公司利邦国际申请纳斯达克IPO上市,募资2500万美元

热门文章

  1. Android之jni编译报错comparsion between signed and unsigned integer expressions解决办法
  2. Android之sqlite常见用法以及取最新多少条数据(包括删除和不删除之外的数据)
  3. 【C语言简单说】二:第一个C语言程序详解(2)
  4. ora22813操作数值超出系统的限制_最新:华为“鸿蒙”操作系统终于面世!一旦遭到限制,将随时启用...
  5. r vector 4 elements_Vector类与Enumeration接口
  6. 如何用Python进行数据探索,探索竞赛优胜方案?
  7. 惊呆了!竟然还有这样的操作!
  8. R语言和 Python —— 一个错误的分裂
  9. python怎么获取lol皮肤名称_LOL手游免费皮肤获得方法 LOL手游皮肤怎么获得
  10. 链表归并成递减c语言,将两个递增的单链表合并为一个递减的单链表