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

有关JAVA函数
假设有这样一个函数:
public   static   void   Test(boolean   b)   throws   RuntimeException{
    if(b)   new   RuntimeException( "Exception   catched ");
    else     System.out.println( "Exception   not   catched ");
}
又有这样一个函数:
public   static   void   Test(boolean   b){
    if(b)   new   RuntimeException( "Exception   catched ");
    else     System.out.println( "Exception   not   catched ");
}

这两个函数的效果貌似一样,请问这一类(后面有throws   xxExcepton和没有throws   xxExcepton)有什么区别?两者在什么情况下用与不用?

先谢谢了.

------解决方案--------------------
带throws,告诉调用它的过程,此方法会抛出异常
------解决方案--------------------
是一个异常的抛出,抛给上一级

至于XX就是异常的类型

如果是main()方法就抛给编译器了,省事,但是不是很好
------解决方案--------------------
除了楼上说的,还有点补充,例子里面throws RuntimeException,其实就是对throws的滥用。什么时候用throws 什么时候用try cathch自己内部解决。取决于你的类的性质和解决的问题,如果你的类是一个比较重要的类,但是它要求一定的先决条件,否则可能会使这个类无效,为了让调用者引起足够的重视需要用throws 强制性的要求调用者来处理可能发生的问题。而且,throws的最好不要是RuntimeException这样的很宽泛的Exception,你需要去建立自己的Exception来抛出它。为什么这么说呢。考虑你throws了一个RuntimeException,那么调用者拿到这个RuntimeException它能知道这个Exception到底是怎么回事么,到底错到哪了?我们之所以一定要throws 其实就好像告诉调用者“你要注意了,你要是调用我的时候要考虑某种错误,你要根据这种错误自己拿出点对策。”如果调用者拿到个RuntimeException,他估计要不就是继续往上抛,要不就是e.printStackTrace()了,那么这样和你自己在内部try catch 然后e.printStackTrace() 有什么本质区别呢?干吗还要多此一举让调用者多写代码呢?再回过头考虑如果你抛出了一个很明确的Exception。比如你throws MoneyNotEnoughException,调用者一拿到这个Exception,它就知道钱不够了,所以它就能做出明确的处理了。
当然了,要是说我就抛出RuntimeException ,但是我知道这个地方抛出的RuntimeException就表示MoneyNotEnoughException,我在调用他的时候我就直接按MoneyNotEnoughException处理,那我也确实也没什么可说的了。
另外,有的情况下,可能出错的这个类,它没有必要的资源来处理这个错误,所以抛给上一层,由上一层来处理,这是完全有可能的。但是这也常常意味着这几个类可能耦合性太强了。