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

有关STATIC 的一点困惑!!!
import   java.io.IOException;
/**
  *
  *   @author   liangquan
  */
public   class   ExceptionTest   {
       
        public   static   void   main(String[]   args){
        try{
        methodA();
        }
        catch(IOException   e){
                System.out.println( "caught   IO   exception: ");
        }
        catch   (Exception   e){
                System.out.println( "caught   exception ");
        }
        }
        /**   Creates   a   new   instance   of   ExceptionTest   */
        public   void   methodA()   {
                throw   new   IOException();
        }
       
}


我知道在MAIN   方法里不能调用methodA方法,因为它不是STATIC   的

    但是当我把   STATIC   加上去了以后不是有两个错误。这是为什么呀?

    为什么我把STATIC   加上去后,它会说
1.   在相应的   try   语句主体中不能抛出异常   java.io.IOException
2.   未报告的异常   java.io.IOException;必须对其进行捕捉或声明以便抛出

请教!!!!!


------解决方案--------------------
methodA()方法实际抛出了一个未被捕获的异常,但并它并没有在方法声明中被声明。

方法自身是相对独立的逻辑单元,你的methodA()不一定总是被main()调用,编译器需要确保methodA()本身符合逻辑。

给methodA()加上异常声明即可:
public void methodA() throws IOException {
throw new IOException();
}
------解决方案--------------------
恩.楼上的回答好标准
------解决方案--------------------
public void methodA() throws IOException {
throw new IOException();
}


其实不要那么在乎单独不单独使用。
你要明白,这两者的区别。
throw new IOException只是告诉你,这里会抛出IOException而已。你完全可以将它去掉,写一些IO操作的语句。这时就不存在所谓的两个同时使用的问题了。

其实可以说,throw一般用在自定义异常的抛出。而java定义的异常你并不需要自己抛出,而你所需要做的只是将其捕获,即try...catch。如果你懒得捕获,你也可以把异常从抛出,这时就需要在被调用的方法签名中加上throws(你可以理解为总是抛出,因为你调用了这个方法,你就必须迫捕获这个方法中没有处理而抛出的异常)。
记住你不捕获异常,你就必须将其抛出!

不过应该在越接近异常抛出的地方捕获越好,不能不负责任地一级一级往上抛,最终抛给jvm处理。因为处理异常并不能啊,这是自己的责任。

------解决方案--------------------
Dan1980()
说得真好,学习了