天天看点

Java基础知识总结:一文讲透 Exception 和 Error 的差别

Exception

Error

都是继承自

Throwable

类,只有

Throwable

类型的实例才可以被抛出

( throw )

或者捕获

( catch )

Error

Error

是指在程序的非正常错误,绝大部分的

Error

都会导致程序(比如

JVM

自身)处于非正常的、不可恢复状态,因为无法预知,所以不便于也不需要捕获,

Error

的例子有

OutOfMemoryError

等,它们都是

Error

的子类。

Exception

Exception

是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。

Exception

又分为可检查

(checked)

异常和不检查

(unchecked)

异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分,例如

IOException

IDE

也会提示你进行捕获,否则报错。

不检查异常就是所谓的运行时异常,类似

NullPointerException

ArrayIndexOutOfBoundsException

之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。

编码经验

  1. 不要使用

    try-catch

    进行参数校验,因为

    try-catch

    操作会产生额外的性能开销,参数校验直接使用 if-else 更合理。
  2. 不要使用

    try-catch

    包裹大段代码,很可能会吃掉异常,我们应该只针对可能产生异常的代码段进行包裹。
  3. 有时候我们经常会自定义异常,这取决于我们是否需要更好地对异常进行分类,例如将某种方法的异常定义为

    checked exception

    ,强制之后用到该方法的地方进行捕获处理。
  4. 另一个就是抛出的异常信息是否脱敏,在实际生产环境中不能将敏感的

    ip

    、用户名 等信息放到异常信息中打印出来。