1.所有的异常都是从Throwable继承而来的,是所有异常的共同祖先。
2.Throwable有两个子类,Error和Exception
Error:错误,对于所有的编译时期的错误以及系统错误都是通过Error抛出的。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。
Exception:是另外一个非常重要的异常子类。它规定的异常是程序本身可以处理的异常。异常和错误的区别是,异常是可以被处理的,而错误是没法处理的。
Checked Exception:可检查的异常,这是编码时非常常用的,所有checked exception都是需要在代码中处理的。它们的发生是可以预测的,正常的一种情况,可以合理的处理。比如IOException,或者一些自定义的异常。除了RuntimeException及其子类以外,都是checked exception。
这类异常通常是在编码时可以预料到的,可能发生的异常
Unchecked Exception:RuntimeException及其子类都是unchecked exception。比如NPE空指针异常,除数为0的算数异常ArithmeticException等等,这种异常是运行时发生,无法预先捕捉处理的。Error也是unchecked exception,也是无法预先处理的。
这类异常在编码中无法预料,即使无法预料到,在运行时jvm也会进行检查,同时抛出异常,抛出的异常和自己编码时抛出的异常效果类似
/** * * 异常处理两种方式的比较: * 1.throws 写在方法声明中,指明此方法执行时,可能会抛出的异常类型 * 一旦方法执行出现异常时,仍会在异常代码处生成一个异常类的对象,满足throws后异常类型时, * 就会被抛出,后面的代码就不再执行 * 2.try-catch-finally:真正将异常处理了 * * 3.如何选择: * 3.1:如果父类中被重写的方法没有throws方法处理异常,则子类也不能使用throws * 即子类重写的方法中必须也要try-catch-finally进行处理 * 3.2:子类重写方法throws的异常不得大于父类方法throws的异常类型 * 这两条的原因:由于多态,子类如果throws了超过父类范围的异常,那么在调用处,就接不住这个异常 * * 3.3:执行的方法a中连续调用了三个具有递进关系的方法b,c,d,那么这三个方法中使用throws抛出异常 * 然后方法a中用一个try-catch-finally将这个三个方法包裹起来 * 原因:b如果运行时出现异常,必须通知a让其不继续往下进行后面的方法c,d * 如果在b内就catch了异常,a就无法得知而继续执行c,d,这样显然是不行的 * */