七、异常处理——3-Checked异常和Runtime异常
3-Checked异常和Runtime异常
1.概述
(1)所有的RuntimeException类及其子类的实例都被称为Runtime异常;不是RuntimeException类及其子类的异常实例则被称为Checked异常;
(2)Java程序必须显式处理Checked异常,若没有处理Checked异常,编译将无法通过;
(3)Checked异常处理的两种方式:
1)当前方法明确知道如何处理该异常,程序应该使用try...catch块捕获该异常,然后在对应的catch块中修复该异常;
2)当前方法不知道如何处理该异常,应该在定义该方法时声明抛出该异常;
(4)Runtime异常无须显式声明抛出,如果程序需要捕获Runtime异常,也可以使用try...catch实现。
2.使用throws声明抛出异常
(1)当当前方法不知道如何处理此种类型的异常,该异常应该由上一级调用者处理;如果main方法同样不知道如何处理该异常,可以使用throws声明抛出异常,该异常交由JVM处理;
(2)JVM处理异常的方式是:打印异常的跟踪栈信息,并终止程序运行;
(3)throws声明抛出异常只能在方法的签名中使用,throws可以声明抛出多个异常类型,多个异常类型之间用逗号隔开,一旦使用了throws声明抛出异常后,程序就无须使用try..catch来捕获该异常了;
import java.io.FileInputStream; import java.io.IOException; public class Test4 { //在方法签名中声明抛出该异常后就不用再try..catch该异常了 public static void main(String[] args)throws IOException { FileInputStream fs = new FileInputStream("a.txt"); } }
(4)如果某段代码中调用了一个带throws声明的方法,该方法声明抛出了Checked异常,则表明该方法希望它的调用者来处理该异常,就是说,调用该方法时,要么放在try块中显式捕获该异常,要么放在另一个带throws声明抛出的方法中:
import java.io.FileInputStream; import java.io.IOException; public class Test5 { public static void main(String[] args) throws Exception { //因为test方法声明抛出了IOException异常 //所以该方法要么处于try...catch块中 //要么处于另一个带throws声明抛出的方法中 test(); } public static void test()throws IOException{ //因为FileInputStream构造器声明抛出IOException异常 //所以调用FileInputStream的代码要么处于try...catch块中 //要么处于另一个带throws声明抛出的方法中 FileInputStream fs = new FileInputStream("a.txt"); } }
(5)子类方法声明抛出的异常类型应该是父类方法声明抛出的异常类型的子类或同种类型,子类方法声明抛出的异常不允许比父类方法声明抛出的异常多:
import java.io.FileInputStream; import java.io.IOException; public class Test6 { public void test()throws IOException{ FileInputStream fs = new FileInputStream("a.txt"); } } class Test7 extends Test6{ //子类方法声明抛出了比父类方法声明更大的异常 //所以出现错误 // public void test()throws Exception{ // FileInputStream fs = new FileInputStream("a.txt"); // } }