★空的 catch 语句块
犯这种错误的人比较少,通常发生在刚学会 Java 或者刚参加工做不久的人身上。
所谓“空 catch 语句块”就是在 catch 语句块中没有对异常做任何处理(好比记错误日志),致使异常信息被丢弃/忽略。一旦程序不能正确运行,因为查不到任何 log 信息,只好从头看代码,靠肉眼找 bug。ide
★没有使用 finally
不少人在 catch 语句以后不使用 finally 语句。因为在 try 语句中可能会涉及资源的申请和释放。若是在资源申请以后、资源释放以前抛出异常,就会发生资源泄露。函数
★笼统的 catch 语句块
有些人为了省事,只在本身模块的最外层代码包一个 try 语句块,而后 catch(Exception)。无论捕获到什么异常,都做统一 log 了事。这种作法比“空 catch 语句块”稍好,但因为不能对具体的异常进行具体处理,对一些可恢复的异常(下面会提到),丧失了恢复的机会。并且也可能致使上述提到的资源泄露的问题。设计
★使用函数返回值进行错误处理
有些人放着 Java 的异常机制不用,而用函数返回值来表示成功/失败(好比:返回 true 表示成功、false 表示失败),简直是“捧着金碗要饭”。我的感受,从 C 转到 Java 的人比较容易有此毛病。这种作法会致使以下几个问题:日志
★不清楚“Checked Exception”和“Runtime Exception”的区别
这个现象比较广泛,俺发现不少2年以上 Java 工做经验的人还没有彻底搞明白二者的区别。看来这个问题得详细说一下。
当初Java的设计者有意区分这两种异常,是别有深意的。其中“Checked Exception”用于表示可恢复的异常(也就是你必须检查的异常);而“Runtime Exception”表示不可恢复的异常(也就是运行时异常,主要是程序 bug 和致命错误,你【不须要】检查)。不过这种作法引来了不少争议(包括不少 Java 大牛),鉴于本帖子主要针对新手,之后再专门来聊这个争议的话题。
为了便于理解,下面我举一个例子来讲明。假设你要写一个 Download 函数,根据传入的 URL(String 参数)返回对应网页的内容文本。这时候有两种状况你须要处理:资源