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++STL 常用 函数 用法(转)
http://www.cnblogs.com/duoduo369/archive/2012/04/12/2439118.html 迭代器(iterator) 个人理解就是把所有和迭代有关的东西给抽象出 ...
- algorithm 简单用法
algorithm 简单用法 #include <iostream> #include <vector> #include <algorithm> using na ...
- QT之在QML中使用C++类和对象
QML其实是对ECMAScript的扩展,融合了Qt object系统,它是一种新的解释性语言,QML引擎虽然由Qt C++实现,但QML对象的运行环境说到底和C++对象的上下文环境是不通的,是平行的 ...
- P2056 采花
题目描述 萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 1-c 表示) ,且花是排成 ...
- bzoj 1101 Zap —— 莫比乌斯反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1101 直接莫比乌斯反演. 代码如下: #include<cstdio> #inc ...
- findBug 错误修改指南
1. EC_UNRELATED_TYPESBug: Call to equals() comparing different types Pattern id: EC_UNRELATED_TYPE ...
- nefu阶乘定理
Description 小明的爸爸从外面旅游回来给她带来了一个礼物,小明高兴地跑回自己的房间,拆开一看是一个很大棋盘(非常大),小明有所失望.不过没过几天发现了大棋盘的好玩之处.从起点(0,0)走到终 ...
- Queue——C#浅谈
1.Queue定义 System.Collections.Queue类表示对象的先进先出集合,存储在 Queue(队列) 中的对象在一端插入,从另一端移除. 2.优点 1.能对集合进行顺序处理(先进先 ...
- 基于STM32的三轴数字罗盘HMC5883L模块的测试
最近买了个数字罗盘模块,调通后发现很不错,非常灵敏,测试的时候精度在1°以内.连续测量模式下,最快测量.输出速率可达75hz,模块每次测量完毕并将数据更新至寄存器后,其DRDY引脚便产生一个低电平脉冲 ...
- shell入门-awk-3
awk的内置变量 NR 表示行 NF 表示段 显示第十行 [root@wangshaojun ~]# awk -F ':' 'NR==10' 1.txtuucp:x:10:14:uucp:/var/s ...