throw和throws那些事儿

2020-06-22  本文已影响0人  代码阿强

throws和throw的基本用法

主动向外抛出一个异常,目的就是告诉调用者我丢了一个异常,需要你处理一下。见代码:

class NoValueException extends Exception
{
    NoValueException(String msg)
    {
        super(msg);
        System.out.println("出现了负数");
    }
}
public class Compute {
    
    //定义一个只做正数加法运算的函数
    static void add(int a,int b) throws NoValueException
    {
        if(a<0||b<0)
        {
            throw new  NoValueException("出现负数");
        }
        System.out.println("答案:"+(a+b));
    }
}

public class TestDemo {

    public static void main(String[] args) {
        try {
            Compute.add(5, -1);
        }catch(NoValueException e)
        {
            e.printStackTrace();
            System.out.println("计算不正确");
        }
    }
}

throw定义在方法中,throws抛给调用者,需要和方法名同行

抛异常的注意事项

抛异常可以同时抛多个异常,就是声明给调用者,这段代码可能会有多个异常产生,需要你每个异常都需要考虑到并且处理一下,但是处理异常的时候我们需要注意处理异常的顺序,见代码:

class AException extends Exception{//Exception是一级异常,A是第二级
    
}
class BException extends AException{//B是第三级异常
    
}
class CException extends BException{//C是第四级异常
    
}
public class Compute {
    static  int state=1;
    static void func()throws AException,BException,CException,Exception {
        if(state==1)
            throw new AException();
        if(state==2)
            throw new BException();
        if(state==3)
            throw new CException();
        
    }

}

public class TestDemo {

    public static void main(String[] args) {
        try {
            Compute.func();
        }catch(CException e)//处理最低一级异常
        {
            e.printStackTrace();
        }
        catch(BException e)
        {
            e.printStackTrace();
        }
        catch(AException e)
        {
            e.printStackTrace();
        }
        catch(Exception e)//处理最高一级异常
        {
            e.printStackTrace();
        }
    }
}

很好理解这样的做法,子类异常肯定包括在父类异常之中,既然你直接处理了父类异常了,那么子类的异常就算处理了,但是父类是一个大概的,子类会更加具体。所以我们往往需要从具体到抽象的顺序进行处理嘛

总结

thorw写在方法里面,throws写在方法同行,对于throws抛出的异常,调用者需要注意一下处理异常的顺序

上一篇 下一篇

猜你喜欢

热点阅读