假设有这样一个函数:
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)有什么区别?两者在什么情况下用与不用?先谢谢了.

解决方案 »

  1.   

    带throws,告诉调用它的过程,此方法会抛出异常
      

  2.   

    是一个异常的抛出,抛给上一级至于XX就是异常的类型如果是main()方法就抛给编译器了,省事,但是不是很好
      

  3.   

    先谢过楼上几位了,但还是不太明白.
    不带throws的那个函数貌似可以完成带throws的功能,那带throws中的throws ***不是多余了吗?另外,如果带throws的函数在函数体中并没有抛出异常,这样也没有警告或者错误什么的,到底两者有什么联系与区别?谢谢指教!!
      

  4.   

    除了楼上说的,还有点补充,例子里面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处理,那我也确实也没什么可说的了。
    另外,有的情况下,可能出错的这个类,它没有必要的资源来处理这个错误,所以抛给上一层,由上一层来处理,这是完全有可能的。但是这也常常意味着这几个类可能耦合性太强了。
      

  5.   

    至于示例的第二种写法,大多用在用Exception控制流程的时候,某种意义上来讲已经偏离了Exception的原意了。从错误处理的角度看,这种代码意义不大。/
      

  6.   

    以上两例是为了问有throws与没throws的区别而随便写写的,不必考虑其有意义与否.