Throwable和Exception;throw与throws
所有异常对象的根基类是 Throwable ,Throwable从Object直接继承而来(这是java系统所强制要求的),并且它实现了 Serializable接口(这为所有的异常对象都能够轻松跨越Java组件系统做好了最充分的物质准备)。两个子类,Error与Exception。Exception是java程序员所最熟悉的,它一般代表了真正实际意义上的异常对象的根基类。也即是说, Exception 和从它派生而来的所有异常都是应用程序能够catch到的,并且可以进行异常错误恢复处理的异常类型。而Error则表示Java系统中出现了一个非常严重的异常错误,并且这个错误可能是应用程序所不能恢复的,例如LinkageError ,或 ThreadDeath 等。
Error 和 RuntimeException 的子类是 unchecked 的,也就是不需要明确地 throws Error 也能编译通过。RuntimeException 表示这种异常是否出现经常不可预料,出现了的话,就中止处理。Error 一般表示无法恢复的故障,也就是你再试一次依然会出错,比如 OutOfMemoryError,试多少次很大概率出错的;Exception 则表示一般性的异常,而且这种异常是设计中早已考虑到很常见的错误,并且一定要求在设计中说明如果处理这种异常。
RuntimException 更接近我们日常生活中的“意外”。Exception 这个更接近我们日常生活中所说的“常见错误”。Error 更像是”见鬼,看来周末国庆不加班是搞不定的“。
Error类和Exception类的父类都是throwable类,他们的区别是:
Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。
Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
Exception类又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception ),运行时异常;ArithmaticException,IllegalArgumentException,编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。而受检查的异常,要么用try。。。catch捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不会通过。
throw与throws的区别
1.throw用在方法体内,throw是语句抛出一个异常(对象);throws是用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。
2.throw是具体向外抛异常的,抛出的是一个异常实例(代码中对应的有model);throws声明了是哪种类型的异常,使它的调用者可以捕获这个异常。
3.throw,如果执行了,那么一定是抛出了某种异常;而throws表示可能出现。
4.同时出现的时候,throws出现在函数头,throw出现在函数体,两种不会由函数处理,真正的处理由函数的上层调用处理。