Java异常处理的总结
前言
异常分为Checked/Unchecked,两种类型,前者集成自Exception,后者集成自RuntimeException。
异常处理机制的优势:将正常的代码与异常处理代码分离,
?
异常抛出的三个场景?
?
- 编程错误导致异常: 如IndexOutOfBoundsException、NullPointerException?,出现这些异常通常由于编程错误导致客户端代码导致异常: 如方法本来需要传入一个yyyymmdd的日期字符串,却传入了人名字符串资源失败导致异常: 内存不足、网络连接失败、找不到要打开的文件等
?
?
最佳实践1. 在设计方法的时候,当决定使用checked exception还是unchecked exception时,先问问自己:“当发生异常,客户端的代码可以做什么?”。如果客户端可以采取相应的恢复措施,使用checked exception,否则使用unchecked exception。
?
2. 不要让你要抛出的checked exception升级到较高的架构层级,比如,不要将SQLException从DAO层传递到业务层,因为业务层关心这个异常,你有两个办法实现这个目的:
?
转换SQLException -> 另一个checked exception,如果客户端代码可以恢复这个异常转换SQLException -> unchecked exception,如果客户端代码什么也做不了3. 代码结束后要关闭、清理资源,使用try finlly,如关闭JDBC连接的代码。
4.?不要忽略异常
?
try {....} catch (IOException ex) {ex.printStackTrace()} // ortry {....} catch (IOException ex) { }?
5. 不要使用异常控制流程
?
public void useExceptionsForFlowControl() {try {while (true) {increaseCount();}} catch (MaximumCountReachedException ex) {}// Continue execution}public void increaseCount() throws MaximumCountReachedException {if (count >= 5000)throw new MaximumCountReachedException();}?
6. 尽力捕获具体异常,而不是Exception这样的高层级异常,下面将导致所有异常(checked、unchecked)都被隐藏。
?
try{....} catch(Exception ex){ }?
7. 一个流程的相同异常,只记录一次。
8. 如果希望客户程序员有意识地采取措施,那么抛出checked exception。比如语句:new?FileInputStream(aFile),它声明为checked exception,要求客户端程序员根据情况处理这个异常,比如如果业务场景认为这是一个正常的行为,在就直接记录一行info或者warning日志;在某些场景下,则需要将异常直接抛出,或者转换为RuntimeException后抛出
9.?在使用unChecked异常时,必须在在方法声明中详细的说明该方法可能会抛出的unChekced异常。由调用者自己去决定是否捕获unChecked异常
/** * * @throws RuntimeException */public static void foo() {}??
?
业务异常:客户端未按正常流程操作导致的异常,都是Checked Exception,比如输入格式有误,取款转账余额不足——使用checked Exception
?
?
如何处理异常?
?
何时使用unchecked exception?
?
设计一个方法是,如果是方法调用者错误使用导致代码BUG——使用unchecked异常。
如下代码,如果调用nextToken()前没有调用hasMoreTokens(),会跑出 NoSuchElementException,这个异常是unchecked exception,因为他它是有错误的使用导致的。
?
?
StringTokenizer tok = new StringTokenizer(aStr); while (tok.hasMoreTokens()) { System.out.print(tok.nextToken()); }?
?
何时使用checked exception?
?
何时转换异常?
?
当你调用的程序声明为checked exception,而你有对这个异常束手无策时,将它转换为unchecked exception
?
何时忽略异常?
?
?
public Date getDate(String str){ Date applyDate = null; SimpleDateFormat format = new SimpleDateFormat(“MM/dd/yyyy”); try{ applyDate = format.parse(applyDateStr); } catch(ParseException ex){ //忽略异常 } return applyDate; } ??
?
参考:
http://onjava.com/pub/a/onjava/2003/11/19/exceptions.html
http://tech.e800.com.cn/articles/2009/79/1247105040929_1.html
http://www.cnblogs.com/JavaVillage/articles/384483.html
?
-- end --