时间:2021-05-19
java中的异常涉及到父子类的问题,可以归纳为一句话:子类的构造函数抛出的异常必须包含父类的异常,子类的方法可以选择抛出“范围小于等于”父类的异常或不抛出异常。
1. 为什么构造函数必须抛出包含父类的异常?
在《thingking in java》中有这么一段话:
异常限制:当覆盖方法时,只能抛出在基类方法的异常说明中列出的那些异常
异常限制对构造器不起作用,你会发现StormyInning的构造器可以抛出任何异常,而不必理会基类构造函数所抛出的异常。然而因为必须构造函数必须以这样或那样的方式被调用,子类构造函数的异常说明必须包含基类构造器的异常说明
这段话起初一开比较绕,但是嘻嘻看一遍就会明白:
首先,异常说明只针对覆盖方法,而构造函数明显不在这个范围,所以子类构造函数可以抛出任何异常,而不用顾及父类构造函数所抛出的异常。但是在new 一个子类对象的时候,父类构造函数一定会被调用,所以子类构造函数调用的对应的父类构造函数所抛出的异常就必须考虑在内,此时又因为“子类构造函数无法捕获父类构造函数所抛出的异常(后面会提)”,所以子类构造函数必须抛出这个异常。
2. 为什么子类构造函数无法捕获父类构造函数所抛出的异常?
因为子类如果想要捕获父类抛出的异常,就必须显示地调用super() ; 或者super(xxx...); 然而super()和this()这些都有一个特性, 就是必须将他们放在第一行, 这与try{}catch{}相矛盾, 所以无法捕获
3. 当子类继承的父类和接口存在相同的方法名时,这时的处理方式就必须遵循异常限制。
class SomeException extends Exception{} class TheOtherException extends Exception{} interface InterF { public void function()throws TheOtherException; } class BaseC { public void function()throws SomeException{} } class SubC extends BaseC implements InterF { //此时只能选择不抛出异常 public void function(){} //报错:Exception SomeException is not compatible with throws clause in InterF.function() // public void function()throws SomeException{} ; //报错:Exception TheOtherException is not compatible with throws clause in BaseC.function() // public void function()throws TheOtherException{} ; }4. 为什么子类只能抛出在基类方法的异常说明中列出的那些异常?
因为子类存在向上转化成父类的可能性,如果允许子类随意抛出异常的话,那么向上转化成父类时,该方法的接口(姑且这么叫吧)会变成父类的方法类型,此时问题来了,子类会抛出异常,而父类却无法对该异常做出处理,所以为保证对象的可替换型,强制要求“只能抛出在基类方法的异常说明中列出的那些异常”。
这里所说的“那些异常”还包括这些异常的子异常!
5. 这一点不知道算不算,也许是我比较愚钝吧,我在看的时候想了好久才明白过来,姑且记下来吧。
以上这篇基于java涉及父子类的异常详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Java异常处理运行时异常(RuntimeException)详解及实例RuntimeExceptionRunntimeException的子类:ClassCa
我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其
Java中内存异常StackOverflowError与OutOfMemoryError详解使用Java开发,经常回遇到内存异常的情况,而StackOverfl
java网络编程java.net类InetAddress此类表示互联网协议(IP)地址。会抛出异常UnknownHostException直接已知子类:Inet
详解Java中多线程异常捕获Runnable的实现1、背景:Java多线程异常不向主线程抛,自己处理,外部捕获不了异常。所以要实现主线程对子线程异常的捕获。2、