点击此处返回总目录 在继承的时候,子类重写了父类的方法,对于异常怎么处理呢? 结论如下,记住即可: 重写方法一定不能抛出新的编译异常或者比父类的异常更加宽泛的异常。 说明: 1. 父类的方法如果抛出编译异常,子类重写的方法可以不抛出编译异常。【例1】 2. 父类方法如果抛出编译异常,子类重写可以抛出同样的编译异常。【例2】 3. 父类方法如果抛出编译异常,子类重写可以抛出父类异常的子异常。【例3】 4. 父类方法如果抛出编译异常,子类重写不能抛出更大的编译异常。【例4】【例5】 5. 父类方法如果抛出编译异常,子类重写不能抛出平级的编译异常。【例6】 6. 父类方法如果没有抛出编译异常,子类也不能抛出编译异常。【例7】 7. 子类重写可以抛出任意的RuntimeException异常。【例8】【例9】 思考题:父类没有抛出异常,那么子类重写方法也不能抛出异常。但是如果子类的重写方法调用了另外一个抛出异常的方法,怎么办呢,到底是抛还是不抛呢? 答:只能在子类重写方法中通过try...catch处理掉。别无选择。【例10】 例1:子类重写父类的方法,父类抛异常,子类不抛异常。可以。
package cn.itcast.demo06; public class Test { } class Fu{ public void fun() throws Exception{ } } class Zi extends Fu{ public void fun(){ //对父类的方法进行了重写,不抛出异常。 } } |
注:为了演示方便,将子父类写到了一个java文件中。其实一个java文件是可以写多个类的,但是只能有一个用public修饰。 例2:抛出同样的异常。可以。
package cn.itcast.demo06; public class Test { } class Fu{ public void fun() throws Exception{ } } class Zi extends Fu { public void fun() throws Exception{ //对父类的方法进行了重写,抛出一样大的异常。可以。 } } |
例3:抛出子类异常。可以。
package cn.itcast.demo06; public class Test { } class Fu{ public void fun() throws Exception{ } } class Zi extends Fu { public void fun() throws NullPointerException{ //对父类的方法进行了重写,抛出更小的异常,可以。 } } |
例4:不能抛出更大的异常。
package cn.itcast.demo06; public class Test { public static void main(String[] args) { } } class Fu{ public void fun() throws RuntimeException{ } } class Zi extends Fu { public void fun() throws Exception{ //对父类的方法进行了重写。抛出了更大的异常。错误。 } } |
例5:不能抛出更大的异常。
package cn.itcast.demo06; import java.io.IOException; import java.util.concurrent.TimeoutException; public class Test { public static void main(String[] args) { } } class Fu{ public void fun() throws IOException{ System.out.println("aaa"); } } class Zi extends Fu { public void fun() throws IOException,TimeoutException{ //抛出了别的编译异常。错误。 System.out.println("bbb"); } } |
例6:抛出平级的异常也不行。
package cn.itcast.demo06; import java.io.IOException; import java.util.concurrent.TimeoutException; public class Test { public static void main(String[] args) { } } class Fu{ public void fun() throws IOException{ System.out.println("aaa"); } } class Zi extends Fu { public void fun() throws TimeoutException{ //抛出了平级的异常。错误。 System.out.println("bbb"); } } |
例7:父类方法如果没有抛出编译异常,子类也不能抛出编译异常。
package cn.itcast.demo06; import java.io.IOException; import java.util.concurrent.TimeoutException; public class Test { public static void main(String[] args) { } } class Fu{ public void fun() { System.out.println("aaa"); } } class Zi extends Fu { public void fun() throws TimeoutException{ System.out.println("bbb"); } } |
例8:可以抛出任意的RuntimeException。
package cn.itcast.demo06; public class Test { public static void main(String[] args) { Zi z = new Zi(); z.fun(); } } class Fu{ public void fun(){ System.out.println("aaa"); } } class Zi extends Fu { public void fun() throws RuntimeException{ //对父类的方法进行了重写 System.out.println("bbb"); } } |
例9:可以抛出任意的RuntimeException。
package cn.itcast.demo06; import java.io.IOException; public class Test { public static void main(String[] args) { } } class Fu{ public void fun() throws IOException{ System.out.println("aaa"); } } class Zi extends Fu { public void fun() throws IOException,RuntimeException{ //对父类的方法进行了重写 System.out.println("bbb"); } } |
例10:
package cn.itcast.demo06; import java.io.IOException; public class Test { public static void main(String[] args) { } } class Fu{ public void fun() { System.out.println("aaa"); } } class Zi extends Fu { public void fun() { try{ method(); }catch(IOException e){ e.printStackTrace(); } } public void method() throws IOException{ throw new IOException(); } } |
|