10.3.2 方法重写时声明抛出异常的限制
10.3.2 方法重写时声明抛出异常的限制
使用throws
声明抛出异常时有一个限制,就是方法重写时“两小”中的一条规则:子类方法声明抛出的异常类型应该是父类方法声明抛出的异常类型的子类或相同,子类方法声明抛出的异常不允许比父类方法声明抛出的异常多。
看如下程序。
1 | import java.io.*; |
上面程序中Sub
子类中的test
方法声明抛出Exception
,该Exception
是其父类声明抛出异常IOException
类的父类,这将导致程序无法通过编译。
Checked异常的缺点
使用Checked
异常至少存在如下两大不便之处。
- 对于程序中的
Checked
异常,Java
要求必须显式捕获并处理该异常,或者显式声明抛出该异常这样就增加了编程复杂度。 - 如果在方法签名中显式声明抛出
Checked
异常,将会导致方法签名与异常耦合
,如果该方法是重写父类
的方法,则该方法抛出的异常还会受到被重写方法所抛出异常的限制。
推荐使用Runtime异常
在大部分时候推荐使用Runtime
异常,而不使用Checked
异常。尤其当程序需要自行抛出异常时,使用Runtime
异常将更加简洁。
不需要在方法签名中声明中抛出Runtime异常
当使用Runtime
异常时,程序无须在方法中声明抛出Runtime
异常,一旦发生了自定义错误,程序只管抛出Runtime
异常即可。
Runtime异常可以使用try-catch捕获
如果程序需要在合适的地方捕获异常并对异常进行处理,则一样可以使用try-catch
块来捕获Runtime
异常。
使用Runtime
异常是比较省事的方式,使用这种方式既可以享受“正常代码和错误处理代码分离”,“保证程序具有较好的健壮性”的优势,又可以避免因为使用Checked
异常带来的编程烦琐性。因此,C#
、Ruby
、Python
等语言没有所谓的Checked
异常,所有的异常都是Runtime
异常。
但Checked
异常也有其优势Checked
异常能在编译时提醒程序员代码可能存在的问题,提醒程序员必须注意处理该异常,或者声明该异常由该方法调用者来处理,从而可以避免程序员因为粗心而忘记处理该异常的错误。