如何区分throw与throws

throw 与 throws

这两个关键字同样都是用在异常处理这一块的 , 虽然看似一样,但实际这两个区别不小

先看定义 :

throw : 用于显式抛出异常,抛出的时候是抛出的是一个异常类的实例化对象.

throws : 定义一个方法的时候可以使用throws关键字声明,表示此方法不处理异常,而交给方法调用处进行处理。

      先解释 throws , 也就是说 , 如果我们一个方法里可能会存在异常 , 我们在这个方法里并不处理, 而是告知 调用这个方法的地方去处理 ,如果是另一个方法去调用这个方法,那么这另一个方法也可以去选择 throws 这个异常 ,也就是继续交给 调用它的上一级去处理 ,也就像踢皮球一样 ,不想处理就丢给它的上一级 ,但最终是要有地方去处理这个异常的,它存在于方法声明处

例 : 

    public void method1() throws UnsupportedEncodingException {
        "s".getBytes("utf-8");
    }
    
    public void method2() throws UnsupportedEncodingException {
        method1();
    }
    
    public void method3(){
        try {
            method2();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

       方法1 里面的这段代码是存在编译期异常的 ,但我们没有去处理它, 而是将它抛给了上一级,也就是方法 2 , 但是方法2也没有去处理 ,而是直接抛给了方法 3 ,在方法3中 它是直接用try catch 组合去捕获处理了这个异常

需要注意的几点是 : 任何方法都可以使用throws关键字声明异常类型,包括抽象方法。

子类重写父类中的方法,子类方法不能声明抛出比父类类型更大的异常(针对编译期异常)。
      子类在重写父类方法时,它所抛出的异常类型只能比父类小或者相等,另外,在我们上述的例子中,如果把方法1 中 throws 抛出的改成Exception 的话 ,那么在method2()中它也只能够去抛出 Exception , 同样的这里我们在往上一级一级抛出的时候 ,类型也是慢慢变大的 ,上一级的范围不能比下一级小,这里method2就可以去抛出 Exception ,而 method1 这样抛出是会报错的
接着来谈 throw 
throw 用于方法体 , 直接抛出一个异常对象
例 : 
public static void method(int x){
        if (x == 0){
            throw new IllegalArgumentException("分母不能为0");
        }
        int i = 10/x;
    }
在异常处理中,try语句要捕获的是一个异常对象,那么此异常对象也可以自己抛出。
这里的意思是,我们可以自己手动抛出这个对象来被 try 捕获 ,我们一般使用throw 后, 要么使用try catch捕获异常,要么使用throws声明异常
因为这里我们仅仅是抛出了异常对象,并没有去处理它
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值