异常处理
throws关键字
若某个方法可能会发生异常,但是不想在当前方法中来处理这个异常,那么可以将这个异常抛出,然后在调用该方法的代码中进行异常的捕获以及处理。
所以将异常抛出,可以用throws关键字来实现,throws关键字通常被应用在声明方法中,用来指定方法可能抛出的异常,多个异常可以用逗号来分隔。
如果异常的类型是Erro和RuntimeException或是它们的子类,那么可以不使用throws关键字来声明。
将异常通过throws关键字抛给上一级,如果仍然不限处理这个异常,可以继续向上抛出,但是最终必须有能够处理这个异常的代码。
格式:
异常是否抛出,站在哪个角度思考
如果是因为传参导致异常,应该通过throws将异常抛出去。
抛是抛给调用该方法的函数。
throw关键字
区分throws和throw。
与throws不同的是,throw用于方法体内,并且抛出一个异常类对象,而throws用在方法声明中。
throw抛出异常后,同样需要使用try…catch语句,上述两张情况,若throw抛出的异常Error、RuntimeException或它们的子类,则无须使用throws关键字或者try…catch。
格式:
为什么要自己抛出异常
有时候传入的参数并不会造成代码报错,但是在现实逻辑上不合理(例如年龄为-1),所以我们要创造一个异常抛出去告诉调用这里存在异常。
使用异常处理语句的注意事项:
在使用try…catch,finally,throw,throws关键字时,要注意:
(1)不能单独使用try,catch或finall语句块。
(2)try语句块后面既可以只使用catch语句块,也可以只是用finally语句,当它们一起使用时,可以存在多个catch语句块,但是只能有一个finally语句,并且finally只能在catch之后。
(3)try只与finally语句块使用时,可以使程序在发生异常后抛出异常,并继续执行方法中的其他代码。
(4)try只与catch语句使用时,可以使用多个catch语句来捕获try语句块的异常,异常发生后,java虚拟机会由上而下来检测当前catch语句块所捕获的异常是否与try语句块中的发生的异常匹配。如果匹配,则不再执行其他catch语句。如果多个catch语句块捕捉的是同种类型的异常,则捕获子类异常的catch语句要放在父类异常的前面,否则编译出错。
(5)在try语句中声明的变量时局部变量,只在当前try语句中有效,在其后面的catch,finally语句中其他位置不能访问该变量,但在try,catch,finall语句块之外声明的变量,可以在ry,catch,finall语句块之内使用。
(6)对于发生的异常,必须使用try…catch语句来捕获。或者通过throws语句向上抛出,否则出错。
(7)在使用throw语句抛出一个异常对象时,该语句后面代码将不会被执行。
(8)finally 执行的时机是在方法返回之前(try 或者 catch 中如果有 return 会在这个 return 之前执行 finally). 但是如果finally 中也存在 return 语句, 那么就会执行 finally 中的 return, 从而不会执行到 try 中原有的 return。所以一般不建议在finally语句块中写return语句。