try-catch的通透解析
我们都知道在写程序时代码有时候会存在异常,那我们就需要对有可能发生的异常进行处理,尤其是初学者,就比较容易疑惑异常应该怎么被处理。
在Java中,处理异常的方式主要有两种:使用try-catch语句块和通过方法签名声明可能抛出的异常。
-
try-catch语句块
有开发经验的人都知道,try-catch语句块处理异常的方式是比较常见的,其中将你要书写的可能会发生异常的代码写在try块中,在catch块中书写对异常处理逻辑,示例看下面
package excetion; public class ExceptionDemo { public static void main(String[] args) { try { //try块的作用主要就是用来发现代码是否抛出异常,如果抛出异常则执行catch块中的代码逻辑 int a = 2/0; }catch (ArithmeticException e) { //当try块中的代码抛出ArithmeticException 异常类型时,则执行该逻辑 System.out.println("程序报错了"); System.out.println("异常类型为:" + e); }catch (ArrayIndexOutOfBoundsException e) { //当try快中的代码抛出ArrayIndexOutOfBoundsException 该异常类型时,则走该方法逻辑; throw new ArrayIndexOutOfBoundsException(e.getMessage()); }catch (RuntimeException e) { //当抛出RuntimeException 异常类型时执行该逻辑 throw new RuntimeException(e.getMessage()); }finally { System.out.println("总会执行的地方"); } } }
注意点:
1、catch块中的异常类型书写排序方法:异常的子类应该写在异常的父类前面,要不然直接把RuntimeException写在最前面,由于他的作用范围很广,容易导致后面定义的异常类型相关逻辑不会被执行。
2、throw 关键字和 return具有一样的作用,都会结束当前方法,即使try-catch后面还有代码,也不会继续执行了,finally除外
3、如果没有使用throw抛出异常,那么程序将会继续执行try-catch 之后的代码
4、finally块中的代码为总会执行的代码块,不管报什么异常都会执行的,通常用于处理一些流的释放等逻辑。
-
方法签名声明异常
通过throws来在方法签名中声明异常,该方式是抛出可能会发生的异常,与throw的不同之处是throw抛出一个具体的异常,与try-catch相比,throws处理异常的方法比较简介易于代码的梳理
//throws可以抛出多个异常类型 public void throwsTest() throws ArrayIndexOutOfBoundsException , ClassNotFoundException,Exception { }
-
疑问
很多人都会对处理异常有一个关键的疑问,就是抛出的异常交给谁处理了?
代码抛出的异常如果没有被捕获,则由该方法的调用者进行处理,层层传递,一直到JVM层,然后终止程序,如果一个方法抛出异常后,并且该方法的调用者有使用try-catch进行处理,那么则会走catch块中的逻辑,如果catch块中存在 throw或者return 方法,则会终止程序,并且抛出异常,如果没有使用那两个关键字,例如使用log.error()进行打印异常,则try-catch块的后续代码还会继续执行。