关于try catch,throw和throws的理解

写了一年代码,直到今天给同事code review时才突然意识到自己对于异常一系列的处理是如此的模糊,内心感到可耻,于是便开了Demo验证了一下,方便自己梳理一下。

程式异常默认向上抛出

众所周知,当我们程式发生异常时,如果没有任何处理,异常往上抛出,也就是向该方法的使用者抛出异常。

在java中,方法的调用,或者说一个线程的程式流程,会在栈空间中存储和操作,栈空间中存储着一个个的栈帧,也就是我们调用的方法。当JVM捕捉到我们的程式发生的异常时,会生成一个异常对象,然后将该方法出栈,所以栈顶元素就会移至该方法的调用者,此时就相当于将该异常往上抛出了。这就形成我们所看到的,异常会一步步往上抛出。

直到,我们的栈回到我们的main方法,此时,调用main方法的JVM会控制控制台输出异常的信息。

try catch的使用

当我们需要对发生的异常进行处理的时候,我们会用到try catch,对于‘处理二字’,这里举个例子,比如我要输出自定义的异常信息,这个时候,try catch就能满足我们的需求。

当我们在try语句范围内的代码出现了异常,自然我们会捕捉到,在范围外的就还是按照默认的方法处理了。

那当我们捕捉到异常后,会发生一种现象,假设我们不做处理,那会出现一种情况,就是异常被你捕捉了,但是你什么事都没做,当你光使用try catch的时候,程式就没办法把你的异常对象自动往上抛出了,这就是我当时review code的时候发现同事的问题。

        try {
            List list = null;
            list.get(0);
            System.out.println("aaa");
        } catch (Exception e) {

        }
        System.out.println("bbb");

程式看起来就是一种异常被你掩藏起来的效果,发生了但是和没发生一样,当然发生异常的代码后面的代码,但是在try范围内的不会继续执行。

 System.out.println("aaa");

但是try范围外的依旧会执行。

System.out.println("bbb");

当然,会有一种情况,在我公司中,如果出现了异常,就不允许继续执行

System.out.println("bbb");

此时,我们就需要用到throw。

throw的使用

同样的代码,我们加上throw后。

        try {
            List list = null;
            list.get(0);
            System.out.println("aaa");
        } catch (Exception e) {
            throw e;
        }
        System.out.println("bbb");

此时的第二句输出便不会执行了,所以throw使用与否,取决于,你后面执行的代码逻辑是否追求原子性,像事务一样。

到此为止,我们所使用的throw会引出我们即将使用throws,因为你如果要往上抛出异常,你就要告诉上一层,我这里可能出现异常。

throws的使用

public void test() throws Exception{

throws的使用就像上述一样,在方法头中,它后面可以借多个异常类,这里一般要求越精准越好,当然是看需求来定。

throws在这里的作用,就是你在这个方法上擦了一个标签,上面写着,我这个方法有可能会出现异常哦!!

则调用者在调用时,就会被ide检测到并提醒他是否处理异常,如果不处理,那就继续往外throws。

以上便是我全部的梳理。

你可能感兴趣的:(Java,java)