AJPFX谈JAVA新手问题之异常处理使用不当

★空的 catch 语句块
  犯这种错误的人比较少,通常发生在刚学会 Java 或者刚参加工做不久的人身上。
  所谓“空 catch 语句块”就是在 catch 语句块中没有对异常做任何处理(好比记错误日志),致使异常信息被丢弃/忽略。一旦程序不能正确运行,因为查不到任何 log 信息,只好从头看代码,靠肉眼找 bug。ide

★没有使用 finally
  不少人在 catch 语句以后不使用 finally 语句。因为在 try 语句中可能会涉及资源的申请和释放。若是在资源申请以后、资源释放以前抛出异常,就会发生资源泄露。函数

★笼统的 catch 语句块
  有些人为了省事,只在本身模块的最外层代码包一个 try 语句块,而后 catch(Exception)。无论捕获到什么异常,都做统一 log 了事。这种作法比“空 catch 语句块”稍好,但因为不能对具体的异常进行具体处理,对一些可恢复的异常(下面会提到),丧失了恢复的机会。并且也可能致使上述提到的资源泄露的问题。设计

★使用函数返回值进行错误处理
  有些人放着 Java 的异常机制不用,而用函数返回值来表示成功/失败(好比:返回 true 表示成功、false 表示失败),简直是“捧着金碗要饭”。我的感受,从 C 转到 Java 的人比较容易有此毛病。这种作法会致使以下几个问题:日志

  1. 返回值通常用整数值或布尔值表示,传递的信息过于简陋;
  2. 一旦调用者忽略了错误返回码,就会致使和“空 catch 语句块”相似的问题;
  3. 对同一个函数的多处调用,都须要对返回值进行重复判断,致使代码冗余。

★不清楚“Checked Exception”和“Runtime Exception”的区别
  这个现象比较广泛,俺发现不少2年以上 Java 工做经验的人还没有彻底搞明白二者的区别。看来这个问题得详细说一下。
当初Java的设计者有意区分这两种异常,是别有深意的。其中“Checked Exception”用于表示可恢复的异常(也就是你必须检查的异常);而“Runtime Exception”表示不可恢复的异常(也就是运行时异常,主要是程序 bug 和致命错误,你【不须要】检查)。不过这种作法引来了不少争议(包括不少 Java 大牛),鉴于本帖子主要针对新手,之后再专门来聊这个争议的话题。
  为了便于理解,下面我举一个例子来讲明。假设你要写一个 Download 函数,根据传入的 URL(String 参数)返回对应网页的内容文本。这时候有两种状况你须要处理:资源

  1. 若是传入的 URL 参数是 null,这代表该函数的调用者出 bug 了,而程序自己的 bug 是很难在运行时自我恢复的。这时候 Download 函数必须抛出 Runtime Exception。而且 Download 函数的调用者【不该该】尝试去处理这个异常,必须让它【尽早】暴露出来(好比让 JVM 本身终止运行)。
  2. 若是传入的 URL 参数非 null,可是它包含的字符串不是一个合法的URL格式(可能因为用户输入错误致使)。这时候 Download 函数必须抛出 Checked Exception。而且 Download 函数的调用者必须捕获该异常并进行相应的处理(好比提示用户从新输入 URL)。
相关文章
相关标签/搜索