Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常)。所有的RuntimeException类及其子类的实例被称为Runtime异常;不是RuntimeException类及其子类的异常实例则被称为Checked异常。
对于Checked异常的处理方式有如下两种:
- 当前方法明确知道如何处理该异常,程序应该使用try…catch块来捕获该异常,然后在对应的catch块中修复该异常
- 当前方法不知道如何处理这种异常,应该在定义该方法时声明抛出该异常。
使用throws声明抛出异常
使用throws声明抛出异常的思路是:当前方法不知道如何处理这种类型的异常,该异常应该由上一级调用者处理;如果mian方法也不知道如何处理这种类型的异常,也可以使用throws声明抛出异常,该异常将交给JVM处理。JVM对异常的处理方法是:打印异常的跟踪栈信息,并中止程序运行。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class ThrowsTest{
public static void main(String[] args) throws FileNotFoundException{
test();
}
public static void test() throws FileNotFoundException{
FileInputStream fis = new FileInputStream("a.txt");
}
}
如果某段代码中调用了一个带throws声明的方法,该方法声明抛出了Checked异常,则表明该方法希望它的调用者来处理该异常。
使用throws声明抛出异常时有一个限制,就是方法重写时遵循:子类方法声明抛出的异常类型应该是父类方法声明抛出的异常类型的子类或相同,子类方法声明抛出的异常不允许比父类方法声明抛出的异常多。