gpt4 book ai didi

java - 使用已检查的异常重写方法

转载 作者:行者123 更新时间:2023-12-01 09:00:04 24 4
gpt4 key购买 nike

我有两个类,A 和 B,其中 B 扩展了 A。我遇到了一个问题,B 引入了一个附加功能,该功能附带一个异常 ExceptionC,该异常不以任何方式应用shape 或 form 为 A,但除非 A 指定它抛出 ExceptionC,否则它不会编译。我知道这是设计使然(因为里氏替换原则)。我的问题有两个:

  1. 里氏替换原则背后的推理是什么?如果 B 扩展了 A,难道它不应该能够添加更多功能并因此添加异常(exception)吗?
  2. 更好的方法是什么?向父类(super class)添加不适用的异常感觉是错误的。

具体情况:

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

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

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

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

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

我有两个普通类、两个异常类和一个接口(interface)。

  • TTTBoard 实现 Board
  • UltimateTTTTBoard 扩展了 TTTBoard 实现 Board
  • TTTBoard.move 抛出 LocationTakenException
  • UltimateTTTBoard.move 抛出 LocationTakenException、TargetBoardFullException

请注意,在标准井字棋中,只有一个棋盘,因此 TargetBoardFullException 完全不适用。

我这样做错了吗?我不应该为此使用异常吗?

最佳答案

以下代码显示了为什么 Java 不允许更改契约:

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.
}
}

当然,它不能编译。但如果会的话,我们是否必须在 main 方法中捕获 IOException(因为它是一个 B 实例)或不捕获(因为我们在接口(interface)上调用该方法)?

关于java - 使用已检查的异常重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41752454/

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