gpt4 book ai didi

浅谈java异常处理(父子异常的处理)

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章浅谈java异常处理(父子异常的处理)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”。那个时候还不知道子类方法为什么要这样子抛出异常,后来通过学习《Thinking in Java》,我才明白其中的道理,现在我再来温习一下.

1、子类方法只能抛出父类方法的异常或者是其子异常 。

对于这种限制,主要是因为子类在做向上转型的时候,不能正确地捕获异常 。

?
1
2
3
4
5
6
7
8
9
10
package thinkinginjava;
 
public abstract class InningDemo1 {
   public void walk() throws BaseException{}
   public abstract void sing() throws BaseException;
}
 
class BaseException extends Exception{}
class SubException1 extends BaseException{}
class CupException extends Exception{}
?
1
2
3
4
5
package thinkinginjava;
 
public interface OtherFunction {
   public void task() throws RuntimeException;
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package thinkinginjava;
 
public class SubInningDemo1 extends InningDemo1 implements OtherFunction{
   //子类方法可以抛出父类方法的异常
   @Override
   public void walk() throws BaseException{}
  
   //但不能抛出父类中没有的异常,否则编译会出错
   //public void walk() throws Exception{}
  
   //子类方法可以抛出父类方法的子异常
   @Override
   public void sing() throws SubException1{}
  
   //当实现的接口和父类中的方法都有异常时,可以选择不抛出异常
   public void task(){}
 
}

就拿这个例子来说,假如子类中有这方法 public void walk() throws CupException{},抛出了父类方法没有的异常,我们使用父类的引用指向子类 。

?
1
2
3
4
5
6
7
public void f(){
 
    InningDemo1 inn = new SubInningDemo1();
 
    inn.walk() ; //父类调用walk()方法时,并不知道它会抛出CupException,从而f()方法不知如何捕获异常。因此在编译期就要防止子类方法乱抛异常。
 
  }

从上面的例子中,我们也可以看到,子类方法可以不抛出异常 。

2、子类构造器必须要抛出父类构造器的异常或者其父异常 。

这是因为子类构造器中默认添加了父类的构造器 。

?
1
2
3
4
5
6
7
8
9
10
11
package thinkinginjava;
 
public abstract class InningDemo2 {
   public InningDemo2() throws SubException{
    
   }
}
 
class FatherException extends Exception{}
class SubException extends FatherException{}
class PenException extends Exception{}
?
1
2
3
4
5
6
7
8
package thinkinginjava;
 
public class SubInningDemo2 extends InningDemo2{
   public SubInningDemo2() throws FatherException {
     //子类构造器中默认添加了父类的构造器,所以需要抛出父类的异常或者其父异常
     //super();
   }
}

3、异常丢失 。

1、在finally中抛出异常,可能会之前抛出的异常丢失 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package thinkinginjava;
 
public class FinallyException {
   public static void main(String[] args){
     try {
       try {
         throw new RedException();
       } finally {
         //把上一个异常覆盖掉
         throw new BlueException();
       }
     } catch (Exception e){
       System.out.println(e);
     }
   }
}
 
class RedException extends Exception{}
class BlueException extends Exception{}

运行结果:thinkinginjava.BlueException 。

2、在finally中使用return,不会抛出异常 。

?
1
2
3
4
5
6
7
8
9
10
11
package thinkinginjava;
 
public class ReturnException {
   public static void main(String[] args){
     try {
       throw new Exception();
     } finally {
       return ;
     }
   }
}

以上代码我们看到它抛出了异常,但运行时不会有任何输出 。

以上这篇浅谈java异常处理(父子异常的处理)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.

最后此篇关于浅谈java异常处理(父子异常的处理)的文章就讲到这里了,如果你想了解更多关于浅谈java异常处理(父子异常的处理)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com