Java异常被分为两大类:Checked异常和Runtime异常。所有的RuntimeException类及其子类的实例被称为Runtime异常;不是RuntimeException类及其子类的异常实例则被称为Checked异常。
只有Java语言提供了Checked异常,其他语言都没有提供Checked异常。Java认为Checked异常都是可以被处理(修复)的异常,所以Java程序必须显式处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误,无法通过编译。
Checked异常体现了Java的设计哲学---没有完善错误处理的代码根本就不会被执行。
对于Checked异常的处理方式有如下两种:
- 当前方法明确知道如何处理该异常,程序应该使用try...catch块来捕获该异常,然后在对应的catch块中修复该异常。
- 当前方法不知道如何处理这种异常,应该在定义该方法时声明抛出该异常。
Runtime异常则更加灵活,Runtime异常无须显式声明抛出,如果程序需要捕获Runtime异常,也可以使用try...catch块来实现。
附录:只有Java语言提供了Checked异常,Checked异常体现了Java的严谨性,它要求程序员必须注意该异常---要么显式声明抛出,要么显式捕获并处理它,总之不允许对Checked异常不闻不问。这是一种非常严谨的设计哲学,可以增加程序的健壮性。问题是:大部分的方法总是不能明确地知道如何处理异常,因此只能声明抛出该异常,而这种情况又是如此普遍,所以Checked异常降低了程序开发的生产率和代码的执行效率,关于Checked异常的优劣,在Java领域是一个备受争论的问题。