异常处理中throw和throws区别

先看示例

public Test() throws RepletException {
    try {
      System.out.println("Test this Project!")
    }
    catch (Exception e) {
      throw new Exception(e.toString());
    }
  }

首先上面这一个例子,我们可以发现在异常处理中,我们会使用到这样的两个很像的两个关键字,那么我们应该怎样区分它们呢?

第一、他们含义不同

Throw是抛出一个具体的异常,代表一种动作。

Throws是用来声明一个方法可能抛出的所有异常信息,代表一种状态。

第二,他们出现的位置不同

Throw 出现在函数体

Throws 出现在方法或者函数头

第三,对异常的处理不同

throw需要用户自己捕获相关的异常,而后再对其进行相关包装,最后将包装后的异常信息抛出

throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法

第四,对应异常不同

Throw 只能用于抛出一种异常

Throws 可以抛出多个异常

    但是,这两者都是消极处理异常的方式,这里的消极并不是说这种方式不好,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

 

举例,如

public void doA(int a, int b) throwsException1,Exception2,Exception3{
           try{
           	······
           }catch(Exception1 e){
              throw e;
           }catch(Exception2 e){
              System.out.println("出错了!");
           }
           if(a!=b){
              throw new  Exception3("自定义异常");
	}
}

    通过方法的声明,我们可以知道这个方法可能会产生3个异常,(Exception1,Exception2,Exception3)

    但是,方法体中有不同的处理,会产生不同的结果

         如果产生Exception1异常,则捕获之后再抛出,由该方法的调用者去处理。

         如果产生Exception2异常,则该方法自己处理了(即System.out.println("出错了!"))。所以该方法就不会再向外抛出Exception2异常了,所以,voiddoA() throws Exception1,Exception3 里面的Exception2也就不用写了。

         而Exception3异常是该方法的某段逻辑出错,程序员自己做了处理,在该段逻辑错误的情况下抛出异常Exception3,则该方法的调用者也要处理此异常。

    我们在开发过程中,往往使用throw而忽略了throws的作用。

    有时候一个方法中产生了异常,但是不知道该怎么处理它,那么就放着不管,当有异常抛出时会中断该方法,而异常被抛到这个方法的调用者那里。这个有点像下属处理不了的问题就交到上司手里一样,这种情况称为回避异常但是这使得调用这个方法就有了危险,因为谁也不知道这个方法什么时候会丢一个什么样的异常给调用者,所以在定义方法时,就需要在方法头部分使用throws来声明这个方法可能回避的异常。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值