Java 异常处理基本规则,Java异常处理的基本规范
看了团队中原来代码中的异常处理,心碎了一地,稍微对照阿里巴巴的异常处理规范整理了一遍,准备分享一下,Java的异常处理规范&约束。
一、运行异常的扑捉
不要捕获 Java 类库中定义的继承自 RuntimeException 的运行时异常类,如:IndexOutOfBoundsException / NullPointerException ,这类异常由程序员预检查来规避,保证程序健壮性。
正例:
if(null != obj) {
//TODO
}
反例:
try {
obj.method()
} catch(NullPointerException e){
//TODO
}
二、 try-catch 作用域(现有代码出现率较高)
对大段代码进行try-catch ,这是不负责任的表现。catch 时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的 catch 尽可能进行区分异常类型,再做对应的异常处理。
正例:
分块catch ,或者直接抛出相对应的异常,然后由下层细化处理。
map.put("status", 500);
try{
//代码省略
map.put("message", "success!");
map.put("status", 200);
} catch (UnknownHostException e) {
//域名错误
map.put("message", "请输入正确的网址");
LoggerUtils.fmtError(e, "网址异常[%s]", url);
} catch (SocketTimeoutException e) {
//超时
map.put("message", "请求地址超时");
LoggerUtils.fmtError(e, "请求地址超时[%s]", url);
} catch (Exception e) {
//其他异常
map.put("message", "请求出现未知异常,请重试!\r\n" + e.getMessage());
LoggerUtils.fmtError(e, "请求出现未知异常,请重试![%s]", url);
}
return map;
反例:
try {
//此处省略1024行代码
} catch(Exception e){
//TODO
}
三、异常的捕捉 & 异常的处理(现有代码出现率较高)
捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。
正例:
try{
//代码省略
} catch (UnknownHostException e) {
//域名错误
map.put("message", "请输入正确的网址");
LoggerUtils.fmtError(XXXXManager.class, e, "网址异常[%s]", url);
} catch (SocketTimeoutException e) {
//超时
map.put("message", "请求地址超时");
LoggerUtils.fmtError(XXXXManager.class, e, "请求地址超时[%s]", url);
} catch (Exception e) {
//其他异常
map.put("message", "请求出现未知异常,请重试!\r\n" + e.getMessage());
LoggerUtils.fmtError(XXXXManager.class, e, "请求出现未知异常,请重试![%s]", url);
}
只为描述一下异常,继续抛出。
try{
//代码省略
} catch (UnknownHostException e) {
throw new HNException("xxx处理失败。",e);
}
反例:
1.如下,调用者对异常没有任何感知。
try{
//代码省略
} catch (Exception e) {
System.out.println("插入异常");
}
2.如下,调用者对异常无法定位和判断
try{
//代码省略
} catch (UnknownHostException e) {
throw new RuntimeException("500");
}
四、异常 & 事务
- 有 try 块放到了事务代码中,catch 异常后,如果需要回滚事务,一定要注意手动回滚事务。
- 在有事务的代码中,catch 异常后,做描述异常等处理后,如果需要事务生效,请把异常继续抛出。
五、异常 & finally
1.如果有对IO 流和资源做操作,必须逐一关闭IO 流和资源对象(从里层到外层),有异常也要做处理。
try{
//代码省略
} catch (Exception e) {
throw new HNException("xxx处理失败。",e);
}finally{
try {
if(null != conn){
conn.disconnect();
}
} catch (Exception e1) {
LoggerUtils.fmtInfo("请求完毕关闭流出现异常![%s]", url);
}
try {
if(null != outStream){
outStream.close();
}
} catch (Exception e2) {
LoggerUtils.fmtInfo("请求完毕关闭流出现异常![%s]", url);
}
try {
if(null != out){
out.close();
}
} catch (Exception e3) {
LoggerUtils.fmtInfo("请求完毕关闭流出现异常![%s]", url);
}
}
JDK 7 以上可以使用try-with-resources 方式。
六、finally & return
不能在 finally 块中使用 return ,finally 块中的 return 返回后方法结束执行,不会再执行 try 块中的 return 语句。
七、异常需要精确
捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类。如果预期对方抛的是绣球,实际接到的是铅球,就会产生意外情况。
八、程序员的基本修养 & NPE(现有代码中出现率较高)
1.方法(接口)的返回值可以为 null ,但不推荐返回空集合,或者空对象等,必须添加注释充分说明什么情况下会返回 null 值。调用方需要进行 null 判断防止 NPE 问题。
防止 NPE ,是程序员的基本修养,注意 NPE 产生的场景。
a.查询数据库返回null ,包括null 对象和null 集合。
b.集合内元素有null 对象。
读者福利
针对于上面的文章我总结出了互联网公司java程序员面试涉及到的绝大部分面试题及答案做成了文档和架构视频资料免费分享给大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。
资料获取方式:加qun群:956011797点击立即加入 找管理小姐姐免费获取!
合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!



Java 异常处理基本规则,Java异常处理的基本规范的更多相关文章
- Java提高篇——Java 异常处理
异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用Syst ...
- 根据异常处理对 Java 方法的层次分类
我根据异常处理对 Java 的方法分为三个层次:1.执行层,2. 处理层,3. 调用层. 执行层方法只抛出异常 throws Exception,是作为代码的基层操作者,可能有多个层次. 处理层方法使 ...
- (java)从零开始之--异常处理(以文件拷贝为例)
开发过程中避免不了对异常的处理,但是异常的处理又不能乱throw 下面是简单的抛异常处理 public static void CopyFile(String souFile,String dirFi ...
- java基础系列--Exception异常处理
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7191280.html 1.概述 Java代码中的异常处理是非常重要的一环,从代码中可以看到 ...
- [ Java学习基础 ] Java异常处理
一.异常概述 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用Sys ...
- java中的try-catch-finally异常处理(学习笔记)
一.异常概述 异常:Exception,是在运行发生的不正常情况. 原始异常处理: if(条件) { 处理办法1 处理办法2 处理办法3 } if(条件) { 处理办法4 处理办法5 处理办法6 } ...
- Java 编程中关于异常处理的 10 个最佳实践
异常处理是Java 开发中的一个重要部分.它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等.Java提供了几个异常处理特性,以try,catch 和 ...
- Java语言中的异常处理
Java语言中的异常处理包括声明异常.抛出异常.捕获异常和处理异常四个环节. throw用于抛出异常. throws关键字可以在方法上声明该方法要抛出的异常,然后在方法内部通过throw抛出异 ...
- Atititjs javascript异常处理机制java异常转换.js exception process
Atititjs javascript异常处理机制java异常的转换.js exception process 1. javascript异常处理机制 Throw str Not throw erro ...
- Java异常机制及异常处理建议
1.Java异常机制 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通过API中Throwable类的众多子类 ...
随机推荐
- c语言代码风格2
1.注释 注释的目的是为了说明做了什么,而不是怎么做,所以注释表达应该准确而又简洁.注释要放在被注释内容的上方或右方.注释一般采用/*.........*/或//........ 对代码源文件和函数应 ...
- 与STL文件相关的各类学习地址
几个网址: 1.STL :https://en.wikipedia.org/wiki/STL_(file_format)#ASCII_STL 2.一个博客的文章地址: 三维图形数据格式 STL的 读取 ...
- css 多行文本以...代替
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Java企业微信开发_03_自定义菜单
一.本节要点 1.菜单相关实体类的封装 参考官方文档中的请求包的内容,对菜单相关实体类进行封装. 这里需要格外注意的是,企业微信中请求包的数据是Json字符串格式的,而不是xml格式.关于json序列 ...
- ADO-添加msado15.dll及基本类对象的了解
一.dll文件的导入 参考文献:https://blog.csdn.net/qq_31209383/article/details/51199762 要使用数据库,首先在stdafx.h中导入msad ...
- IO - 文件的读取与写入
最近有较多提取文档内容,然后拼接成sql之类的,但是纯粹的复制粘贴又太傻,就写了一个脚本,自动读取文件内容(word文档可能需要复制成txt文本),然后拼接sql,最后写入到指定文件中,试了下还是蛮好 ...
- windows 7下mingw+msys编译ffmpeg
windows 7下mingw+msys编译ffmpeg 1-->下载安装MingW,mingw-get-inst-20120426.exe http://sourceforge.ne ...
- bzoj 3232: 圈地游戏 01分数规划
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3232 题解: 首先我们看到这道题让我们最优化一个分式. 所以我们应该自然而然地想到01分 ...
- 无密码登录Linux服务器
1.使用windows上的SecureCRT生成密钥对. Tools->Create Public Key..->RSA->Passphrase(最好输入,也可为空)->长度默 ...
- UIButton常见用法
//UIButton是iOS中用来响应用户点击的控件,既可以显示文字,也可以显示图片,也可以处理用户交互 //UIButton的创建,一般采用类方法来创建,不需要释放 //UIButton 也是UIC ...