日期:2014-05-20  浏览次数:20928 次

throw与throws的区别,什么时候用?
void foo() throws FooException{  
  //other code  
   
  throw new FooException();  
  }  


网上的解释我综合一下是

 throw语句用在方法体内,表示抛出异常,由方法体内的语句处理  
  throws语句用在方法声明后面,表示再抛出异常,由调用这个方法的上一级方法中的语句来处理

可是上面程序里面方法后面用throws抛出异常了,方法里面的语句为什么还要抛出一个同样的异常吗?按照上面的解释在方法后面声明了之后就交给调用这个方法的上级去处理了,在方法语句里面声明的是由这个方法来处理,所以抛出一个就可以了,为什么要抛出两个。


还有我在方法后面抛出的是一个异常类,在方法语句里面抛出的是一个异常类的对象,这两个抛出异常的方法究竟由什么区别呀?为什么要又两种抛出异常的方式?

------解决方案--------------------
throws主要是声明这个方法会抛出这种类型的异常,使其他地方调用它时知道要捕获这个异常。 throw是具体向外抛异常的动作,所以它是抛出一个异常实例。
------解决方案--------------------
throws说明你有哪个可能,倾向
throw的话,那就是你把那个倾向变成真实的了
同时:
1)throws出现在方法函数头;而throw出现在函数体;
2)throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常;
3)两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
------解决方案--------------------
throws E1,E2,E3 只是告诉程序这个方法可能会抛出这些个异常,方法的调用者可能要处理这些异常。而这些异常E1,E2,E3可能是该函数体产生的。

而throw是明确之处这个地方要抛出这个异常。

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

代码块……中可能产生异常Exception1、Exception2和Exception3。
如果产生Exception1异常,则捕捉了之后抛出由该方法的调用者去做处理;
如果产生Exception2异常,则该方法自己做了处理(打印出了说出错了),所以该方法就不会再向外抛出Exception2异常了,void doA() throws Exception1,,Excpetion3里面的Exception2也就不用写了;
而Exception3异常是该方法的某段逻辑出错,程序员自己作了处理在该段逻辑错误的情况下抛出异常Exception3,则调用者也需要处理。
------解决方案--------------------
throws说明在这个方法中可能会抛出的异常,但并不是全部,可以只指出那些需要上级处理的异常,有些异常可以在方法内部就被处理掉了; 
throw就是将抛出一个异常,这可能是人为的,也可能是系统抛出的,只要执行了throw就一定会抛出一个异常。
此外还有一些特征:
1)throws只能出现在方法函数头;而throw只能出现在函数体;
2)throws表示出现异常的一种可能性,并不一定会发生这些异常;

------解决方案--------------------
楼上的大侠们总结的很不错啦!!!学习了,以前自己也不是很清楚……
简单来说就是throws是告诉人家你要抛,打算抛,可能抛,如果真的抛出来了,你系统就别大惊小怪的给我报错,继续执行程序就行。……throw就是真的抛了,但是如果使用throw抛了一个没有用throws声明过的异常,系统就认为你没有考虑到此可能性,他必须提醒你,于是便在控制台打印一堆错误代码,然后帮你把程序强行终止掉…………
------解决方案--------------------
受教了!