具有已检查异常的覆盖方法

时间:2017-01-19 21:56:52

标签: java oop inheritance

我有两个类,A和B,其中B扩展A.我遇到了一个问题,其中B引入了一个附加功能,该异常ExceptionC附带的任何形式或形式都不适用到A,但它不会编译,除非A指定它throws ExceptionC。我知道这是设计的(因为Liskov替代原则)。我的问题有两个:

  1. Liskov替换原则背后的原因是什么?如果B扩展A,那么它是否应该能够添加更多功能,因此会出现异常?
  2. 什么是更好的方法呢?向超类添加不适用的异常是错误的。
  3. 具体情况:

    我正在用Java编写Ultimate Tic-Tac-Toe的实现。基本上采用井字游戏网格并用井字游戏网格填充,如下所示:

     | | # | | # | | 
     | | # | | # | | 
     | | # | | # | | 
    #################
     | | # | | # | | 
     | | # | | # | | 
     | | # | | # | | 
    #################
     | | # | | # | | 
     | | # | | # | | 
     | | # | | # | |
    

    你从中心开始,无论X进入那个网格,O都会进入与较大网格相对应的网格,所以在两次移动后它可能看起来像这样:

     | |O# | | # | | 
     | | # | | # | | 
     | | # | | # | | 
    #################
     | | #X| | # | | 
     | | # | | # | | 
     | | # | | # | | 
    #################
     | | # | | # | | 
     | | # | | # | | 
     | | # | | # | |
    

    如果目标网格已满或已经获胜,下一个人可以选择进入哪个网格。

    我有两个普通的类,两个异常类和一个接口。

    • TTTBoard实施董事会
    • UltimateTTTBoard扩展了TTTBoard实现Board
    • TTTBoard.move抛出LocationTakenException
    • UltimateTTTBoard.move抛出LocationTakenException,TargetBoardFullException

    请注意,在标准的tic-tac-toe中,只有一个板,因此TargetBoardFullException完全不适用。

    我这样做错了吗?我不应该为此使用例外吗?

1 个答案:

答案 0 :(得分:1)

以下代码说明了Java不允许更改合同的原因:

var pattern = /([A-Z][^\.!?]*[\.!?])/ig;
var match;
while ((match = pattern.exec(surroundingTextStr)) != null){
    // How can I check that this sentence currently holds the cursor?
}

当然,它没有编译。但是如果它会,我们是否必须在main方法中捕获IOException(因为它是class A { public void method() { // do something } } class B extends A { public void method() throws IOException { // <- compile error here // do something and throw and exception } } class App { public static void main(String[] args) { A a = new B(); a.method(); // to try or not to try, that's the question now. } } 实例)或不是(因为我们在接口上调用该方法)?