异常分类
- java.lang.Exception
- 编译时异常(受检异常)
- IOException
- ClassNotFoundException
- 运行时异常(非受检异常)
- NullPointerException
- ArrayIndexOutOfBoundsException
- NumberFormatException
- 编译时异常(受检异常)
异常的处理:抓抛模型
过程一:程序在执行过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出。一旦抛出对象以后,其后代码不在执行。
过程二:可以理解为异常的处理方式:
- try-catch-finally
- 使用try将可能出现异常的代码包起来,在执行过程中一旦出现异常,生成一个对应异常的对象,根据此对象对应的异常类型去catch中匹配异常
- catch中处理异常一般用
String getMessage或者printStackTrace() - finally中写必须要执行的代码。比如在try中return或者在catch中再次出现异常则会导致不写finally的代码不会得到执行。像数据库连接、输入输出流、网络编程socket等资源,JVM不能自动垃圾回收,因此需要手动释放资源,此时的资源释放就需要声明在finally中。
- 使用这种方式处理异常可以使编译时异常转换为运行时异常,但针对运行时异常就不需要这种方式处理异常了
- throws
- throws + 异常类型写在方法的声明处指明此方法执行时,可能会出现的异常类型。一旦出现异常仍然会生成一个异常对象,此对象类型满足声明的异常类型时,就会被抛出,异常后面的代码就不再执行。try-catch-finally真正将异常处理掉了,throws的方法只是将异常抛给了方法的调用者,并没有将异常处理掉。
- 选择的问题
- 子类方法抛出的异常小于等于父类方法中抛出异常。
- 父类中被重写的方法没有throws抛出异常,子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finally的方式处理
- 执行的方法a中,先后调用了另外的几个方法,这几个方法是递进执行的,建议这几个方法使用throws抛出异常,而方法a可以使用try-catch-finally的方式处理异常
throw和throws的区别
异常的处理可以用抓抛模型来解释。抓的过程主要有两个,一个是程序在执行过程中出现异常,系统自动生成异常类对象,其后代吗不再执行。还有一个过程其实我们可以自己手动抛出异常,即手动生成一个异常对象并抛出。此为throw。
而throws对应抓抛模型的抓过程,即将抛出来的异常,无论手动还是系统自动出来的异常,向上抛给方法去处理。此过程对应的是异常处理的方式。