java中异常要关注的点

1、空的 catch 语句块

  所谓“空 catch 语句块”就是在 catch 语句块中没有对异常作任何处理(比如记错误日志),导致异常信息被丢弃/忽略。一旦程序不能正确运行,由于查不到任何 log 信息,只好从头看代码,靠肉眼找 bug。

2、没有使用 finally

  在 catch 语句之后不使用 finally 语句。由于在 try 语句中可能会涉及资源的申请和释放。如果在资源申请之后、资源释放之前抛出异常,就会发生资源泄露!

3、笼统的 catch 语句块

  为了省事,只在自己模块的最外层代码包一个 try 语句块,然后 catch(Exception)。不管捕获到什么异常,都作统一 log 了事。这种做法比“空 catch 语句块”稍好,但由于不能对具体的异常进行具体处理,对一些可恢复的异常,丧失了恢复的机会。而且也可能导致上述提到的资源泄露的问题。

4、使用函数返回值进行错误处理

  有些人放着 Java 的异常机制不用,而用函数返回值来表示成功/失败(比如:返回 true 表示成功、false 表示失败),简直是“捧着金碗要饭”。这种做法会导致如下几个问题:
  1. 返回值一般用整数值或布尔值表示,传递的信息过于简陋;
  2. 一旦调用者忽略了错误返回码,就会导致和“空 catch 语句块”类似的问题;
  3. 对同一个函数的多处调用,都需要对返回值进行重复判断,导致代码冗余(代码冗余的坏处,上一个帖子也已经聊过了)。

5、不清楚“Checked Exception”和“Runtime Exception”的区别

  Java的设计有意区分这两种异常,是别有深意的。其中“Checked Exception”用于表示可恢复的异常(也就是必须检查的异常);而“Runtime Exception”表示不可恢复的异常(也就是运行时异常,主要是程序 bug 和致命错误,【不需要】检查)。不过这种做法确实引来了一些多争议,也不必深究,对使用不会造成影响,更多是规范和“优雅”方面的问题。
  Error : 系统级别的错误,如栈溢出 内存溢出之类 ,此类错误一般情概况保证程序能安全退出即可
  Exception : 分为 RuntimeException 和 非RuntimeException
    1.RuntimeException: 程序员的错误,程序的错误,需要修改程序 如: 空指针异常 类型转换错误 数组越界
    2.非RuntimeException: 外部环境导致程序的异常,和程序无关 如:在读取外部文件的时候,出现文件找不到的情况
  Checked异常必须被显式地捕获或者传递,而unchecked异常则可以不必捕获或抛出。
  Checked异常继承java.lang.Exception类。Unchecked异常继承自java.lang.RuntimeException类。

异常的分类

  ① 异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception,具体的RuntimeException继承RuntimeException。
  ② Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。

每个类型的异常的特点

1.Error体系 :
  Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形。应用程序不应该抛出这种类型的对象(一般是由JVM抛出)。如果出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以,在进行程序设计时,应该更关注2.Exception体系:
  Exception体系包括RuntimeException体系和其他非RuntimeException的体系 :
  ① RuntimeException:RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。 属于unchecked。
  ②其他非RuntimeException(IOException等等):这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。属于checked。
  下面通过一个例子来说明。假设要写一个 Download 函数,根据传入的 URL(String 参数)返回对应网页的内容文本。这时候有两种情况你需要处理:

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

扫描二维码,在手机上阅读!

发表评论

电子邮件地址不会被公开。 必填项已用*标注