一、Throwable
错误
异常
所有的异常都是由 Throwable 继承而来, 在下一层分解为 Error 和 Exception 两个分支。 Error 类用于表示程序不试图恢复的不可查严重错误的情况。 应用程序不应该抛出这种类型的对象。如果出现这种错误,我们只能把信息通知给用户然后尽量安全地终止程序。程序一般不处理这类情况。
Exception 类是所有可查和不可查异常的父类。出现这种情况的时候最好不要中断程序而是编写代码处理异常。
RuntimeException 类是用于由程序错误产生的不可查异常的父类, 它表示设计或实现中的问题,而程序本身编译没有问题。也就是说程序正确运行的话这种情况是不会出现的
二、异常
异常根类:Exception
异常产生及传递的机制及对代码运行的影响
异常是在运行时可能产生,如果异常产生了,异常产生后的代码终止运行。
虚拟机是如何处理异常:
当有异常产生时,虚拟机会创建一个异常对象,接着查看所在语句块是否有异常处理机制,如果有,本地处理,如果没有,查找上一层的调用者,如果上一层也没有处理机制,会继续抛到上一层,一直找到main方法为止,如果main方法也没处理,虚拟机直接关闭
异常处理机制
try,catch,finally
try
是必须要有的,当这个语句块中产生异常时,异常之后的语句不会执行
catch
可以有多个语句块,多个语句块时,每个catch捕获一种类型异常,父类型异常必须放在后面
当某种异常产生后,对应的语句块才会执行,如果没有产生异常,所有的catch块都不会运行
finally:不管是否有异常产生,这个语句块中的代码肯定会执行的
try,catch,finally可以如何组合:try...catch,try...catch...finally,try...finally
throw,throws
当一个异常本地不能处理时,需要系统统一处理,可以将它抛出
throw 抛出异常
throws 声明抛出异常,标识这个方法会抛出哪些类型的异常,用在方法声明中,告诉方法调用者要负责处理异常
try,catch,finally本地处理,开销要小
throw开销要大,但在开发过程中,通常底层产生异常后,应该由系统统一来处理,并给用户返回合适的提醒、建议
异常分类
checked异常:如果一个异常强制要程序员来写try...catch,或声明抛出来处理,那么它是checked异常
unchecked异常 :如果一个异常不强制程序员处理,就是unchecked异常,要定义unckecked异常,只需要继承RuntimeException
自定义异常
最基本的要求是继承Exception
三、异常快捷键
alt+shift+z
如果在一个方法内要求抛出多个异常,那么在方法声明后面使用 throws 子句,并且各
个异常使用“,”隔开:
public void reflect(Class cl) throws SecurityException,
NoSuchFieldException
如果在子类中覆盖了一个父类抛异常的方法, 子类中声明的可查异常不能超过父类方法声明的异常范围。 换句话说就是子类方法中抛出的异常只能是父类方法抛出异常相同的类或其子类,或者根本不抛出任何异常。如果父类方法没有抛出任何可查异常,那么子类的方法也不能抛出任何可查异常
值得注意的是,catch 子句的顺序很重要,如果 catch 的多个异常有继承关系,按代码顺序,先 catch 的异常的范围要求比后 catch 的异常范围小,也就是说,先 catch 的异常是后 catch 的异常的子类:
习惯上自定义异常类包括两个构造器:一个默认构造器和一个带有描述信息的构造器,
然后您可以自己定义一些必要的属性和方法
要引发自己创建的异常只需要创建该异常的实例,然后使用 throw 语句即可