run函数不是你新定义的,而是实现接口Runnable中的,而接口Runnable中的那个接口函数原型中并没有throw什么异常,所以,你这样作是不可以的。否则,当时从Runnable接口上使用你的对象时,就会有2未捕获的异常,从而产生语言的混乱,是不是?

解决方案 »

  1.   

    不是说非runtimeException ,必须都先声明吗?
    这个如何解释呢
      

  2.   

    不是声明不声明的问题,这个run方法就是不可以抛出任何异常,因为Runble接口中的方法原型已经规定了,除非你定义另外一个。而不是重载这个public void run()。
    如果你是定义另外一个函数,比如:public void run(int i),那么你爱抛啥异常就抛啥异常。但问题是,这样的函数从runnable接口上是调不到的,换句话说,几乎是没用的。
      

  3.   

    还是不明白throws和try/catch有什么联系,何时该用throws?
      

  4.   

    当你的方法会throw异常,那么就必须把可能throw出来的异常声明出来,否则当然没必要了。
    一旦你的方法被声明为可能抛出异常,别人调用时就必须使用try/catch。至少Java里头时这样的。sorry,前面说错了,不是重载,是override(我也不知道到底那种翻译更好)。
      

  5.   

    现在先假设你已经写好了一个方法的方法体,除了异常处理机制之外,也就是说还没写try/catch或者throws。假设这个方法的这段代码可能抛出多种异常,比如有A,B,C,D四种异常。这时,如果你想在方法内部处理某个异常,你就应该使用try/catch捕捉这个异常。比如你想在方法内部处理A和B异常,就该这样:
    try{
      ...
    }
    catch(A a){
      ...
    }
    catch(B b){
      ...
    }
    同时,你不想在方法体内部处理C和D异常,就该在方法声明的后面throws这两个异常,比如
    public void myMethod() throws C,D{
      try{
        ...
      }
      catch(A a){
        ...
      }
      catch(B b){
        ...
      }
    }
    如果想所有异常都在方法内部处理,就都放在catch中,不用写throws,如果都不想放在方法内部处理,就不用写try/catch,而是都写在throws后面这么说能明白了吧?
      

  6.   

    如果已经catch某个异常,java就会认为这个方法不会再向外界抛出,就没必要再throws这个异常,就会报错,除非你在catch这个异常的时候又抛出这个异常
      

  7.   

    估计是不是这样的,
    当内部try 有异常 而没有catch,那么就要throws一下,好让使用它的处理这个异常