Java中异常的处理及捕获
一、异常的概述
(1)Java中异常的作用:增强程序的健壮性
(2)在Java中所有的Error(错误)和异常(Exception)都继承了同一个父类Throwable
二、异常产生的原因(Java异常的种类)
在Java中异常产生主要有三种原因:
(1)程序内部错误所产生的异常。比如数组越界(ArrayIndexOutOfBoundsException)、空指针异常(NullPointerException)等,这种异常叫做非受检异常,这类异常不需要在代码中声明抛出,但需要在类中处理这些异常。
运行时异常(RuntimeException)下的各类异常都属于非受检异常。
(2)通过throw(抛出异常)语句手动生成的异常,这种异常叫做受检异常。受检异常这种异常在编译时就可以被检测出来,必须在代码中进行处理或者声明抛出,否则编译不通过。例如:IOException,FileNotFoundException,ClassNotFoundException,SQLException等。
(3)Error:这类异常通常是由Java虚拟机(jvm)或硬件引起的。比如:OutOfMemoryError,StackOverFlowError等。
三、异常的处理
3.1异常的抛出(throw)
1、throw是将异常抛给调用者,由其调用者来对异常信息进行处理。在编写程序时,如果程序中出现错误,这就需要将异常信息通知给调用者,这里就可以借助关键字throw,抛出一个指定的异常对象,将错误信息告知给调用者。
2、throw必须写在方法体内,且一旦出现异常后面的代码就不会执行。
3、如果抛出的是编译时异常(受检异常),咱就必须得处理掉这个异常,否则无法通过编译。
如果抛出的是运行时异常(非受检异常),则可以不用处理,直接交给jvm来处理。(其实最好要是能处理的话还是处理一下子!!!!)
3.2异常的捕获
3.2.1 throws捕获异常
throws处在方法声明参数列表之后,当方法抛出编译时异常,而你又不想处理该异常,此时就可借助throws将异常抛给方法的调用者来处理。
1、格式:
修饰符 返回值类型 方法名(参数列表) throws 异常类型 {
}
2、如果说方法内抛出多个异常,throws之后就必须跟多个异常类型,用逗号进行分隔
3、如果抛出多个异常有父子关系,直接声明父类
4、调用声明抛出异常的方法时,调用者必须对该异常进行处理,或者继续使用throws抛出。
3.2.2、try-catch捕获异常并处理
1、当程序抛出异常的时候,我们可以通过try-catch对异常进行捕获处理。
2、需要明确如果程序抛出的异常不做处理,那就会交给jvm来处理,jvm处理就会把程序立即终止。这样我们就明白了,使用try-catch进行异常捕获时必须捕获对应的异常,如果捕获的不是对应的异常,也会让jvm进行处理。
4、如果try抛出多个异常就必须用多个catch进行捕获,这里注意,用多个catch进行捕获不是同时进行捕获,因为不能同时抛出不同的异常。
也可简写成如下:
5、如果异常之间有父子关系,那就必须子类异常在前,父类异常在后catch,不然会报错。
3.2.3、finally
1、finally不管程序正是否抛出异常,finally都会被执行。
2、finally用于进行资源回收或是一些收尾的操作,无论程序正常进行,还是退出都需要回收资源。
情况一:引发异常时,finally会被执行。
情况二:程序段正常结束后,finally下的语句也会被执行
3、即使有return,finally也会被执行。
4、总结:
throw抛出异常,throws声明异常并捕获,try-catch捕获异常
finally语句一定会执行
3.3自定义异常类
虽然Java中有很多异常类,但是在开发中我们会遇到很多异常,不能完全表示,这就需要我们通过自定义的异常类进行解决。
上代码:
首先:自定义异常类MyException
抛出自定义异常类,并进行捕获处理
自定义异常类的总结:
自定义异常类默认会继承Exception或者RuntimeException
继承于Exception的异常默认是受检异常
继承于RuntimeException的异常默认是非受检异常
注意,处理继承Exception(受检的)自定义异常时,必须对抛出的异常进行捕获处理,否则无法编译通过。