一 Checked异常和Runtime异常介绍
- Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常)。所有RuntimeException类及其子类的实例被称为Runtime异常;不是RuntimeException类及其子类的异常实例则被称为Checked异常。
- Java认为Checked异常都是可以被处理(修复)的异常,所以Java程序必须显示处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误,无法通过编译。
- 对于Checked异常处理方式有如下两种:
(1)当前方法明确知道如何处理该异常,程序应该使用try...catch块来捕获该异常,然后在对应的catch块中修改该异常。
(2)当前方法不知道如何处理这种异常,应该在定义该方法时声明抛出该异常。 - Runtime异常无需显式声明抛出,如果程序需要捕捉Runtime异常,也可以使用try...catch块来捕捉Runtime异常。
二使用throws声明抛出异常
- throws声明抛出异常的思路是:当前方法不知道应该如何这种类型的异常,该异常应该由上一级调用者处理,如果main方法也不知道应该如何处理这种类型的异常,也可以使用throws声明抛出异常,该异常将交给JVM处理。JVM对异常的处理方法是:打印异常跟踪栈信息,并中止程序运行,这就是前面程序在遇到异常后自动结束的原因。
- throws声明抛出只能在方法签名中使用,throws可以声明抛出多个异常类,多个异常类之间以逗号隔开。throws声明抛出的语法格式如下
throws ExceptionClass1 , ExceptionClass2...
三 throws应用1
1 代码示例
import java.io.*; public class ThrowsTest { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("a.txt"); } }
2 运行结果
Exception in thread "main" java.io.FileNotFoundException: a.txt (系统找不到指定的文件。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
at ThrowsTest.main(ThrowsTest.java:9)
3 结果分析
该程序不处理IOException异常,将该异常交给JVM处理,所以程序一旦遇到异常,JVM就会打印该异常的跟踪栈信息,并结束程序。
四 throws应用2
1 代码示例
import java.io.*; public class ThrowsTest2 { 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 fis = new FileInputStream("a.txt"); } }
2 运行结果
Exception in thread "main" java.io.FileNotFoundException: a.txt (系统找不到指定的文件。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
at ThrowsTest2.test(ThrowsTest2.java:19)
at ThrowsTest2.main(ThrowsTest2.java:12)
3 结果分析
test方法声明抛出了Checked异常,则表明该方法希望它的调用者来处理该异常。main方法要么放在try块中显示捕获该异常,要么带throws声明抛出让JVM处理。
五 throws应用3
1 代码示例
import java.io.*; public class OverrideThrows { public void test()throws IOException { FileInputStream fis = new FileInputStream("a.txt"); } } class Sub extends OverrideThrows { // 子类方法声明抛出了比父类方法更大的异常 // 所以下面方法出错 public void test()throws Exception { } }
2 运行结果
编译无法通过。
3 结果分析
throws声明抛出时有一个限制:子类方法声明抛出的异常类型应该是父类方法声明抛出的异常类型的子类或相同,子类方法声明抛出的异常不允许比父类声明抛出异常多。
上面程序中Sub子类中的test()方法声明抛出Exception,该Exception是父类声明抛出异常IOException类的父类,导致程序无法通过编译。