有关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()
说得真好,学习了