在异常类层次的最上层有一个单独的类叫做Throwable,用来表示所有的异常情况。
每个“异常”类型都是Throwable的子类。
Throwable有两个直接的子类,一类是Exception,是用户程序能够捕捉到的异常情况。我们将通过产生它的子类来创建自己的“异常”。
另一类是Error,它定义了那些通常无法捕捉到的异常。我们要谨慎使用和处理Error子类,因为它们通常会导致灾难性的失败。
在Exception中有一个子类RuntimeException,它是程序运行时对某些错误做出反应而自动产生的。
常见的异常类:
所有使用try{} catch(Exception e){}的代码块只能找到你一半的错误。但是,是否try并catch Throwable取决于你捕捉它的原因。快速的看一下Error的子类,它们的名字类似VirtualMachineError,ThreadDeath,LinkageError。当你想捕获这些家伙们的时候,你要确定你需要捕获它们。因为那些都是很严重的错误。
但是ClassCastException是一个error吗?不完全是。ClassCastException或任何类型的exception只是虚拟机(VM,VirtualMachine)让你知道有问题发生的方式,这说明,开发者产生了一个错误,现在有一个机会去修正它。
另一方面,error是虚拟机的问题(通常是这样,但也可能是操作系统的问题)。引用Java文档中关于error的说明:“Error是Throwable的子类,它的出现说明出现了严重的问题。一般应用程序除非有理由,否则不应该捕捉Error。通常这是非常反常的情况。”
所以,error非常强大,而且但处理它远比一般开发者想象的要难(当然不是你)。如果你在做一项很简单的工作的话,你认为有必要去处理error?