gpt4 book ai didi

java - Exception Java API 是否违反了 Liskov 原则?

转载 作者:行者123 更新时间:2023-11-30 07:06:14 24 4
gpt4 key购买 nike

根据 java.lang.Exception 层次结构: enter image description here

并且给定里氏替换原则:...如果 S 是 T 的子类型,则类型 T 的对象可以替换为类型 S 的对象...

我们对子类有两种不同的行为(选中与未选中),并且在某些情况下我们无法用子类对象有效地替换基类的使用,除非我们更改当前代码,例如,如果我们编写如下代码:

try{
InputStream is = new FileInputStream("C://test.txt");//throws IOException
while((i=is.read())!=-1){
c=(char)i;
System.out.print(c);
}
}catch(Exception e){// can not be replaced by any subtype, but IOException
e.printStackTrace();
}

这是否违规?为什么/为什么不?

来源:http://www.oracle.com/technetwork/articles/entarch/effective-exceptions-092345.html

编辑 1

示例 2:

给定方法:

public class MyClass {
public void test() throws Exception{
// nice stuff
}
}

和客户:

public class MyTest {

MyClass clazz = new MyClass();

// 'Exception' can not be changed by a subclass directly
public void testTest() throws Exception {
clazz.test();
}
}

编辑2

你是在告诉我,我可以创建一个子类并重写该方法而不抛出异常,这是完全有效的,但这不是我想向你展示的。

当我说“Exception”不能被子类直接改变时,我的意思是:你不能写这样的东西:

// You can not do this at home
public class MyTest {

MyClass clazz = new MyClass();

// hey look!, there is a compiler error!
public void testTest() throws NullPointerException {
clazz.test();
}
}

最佳答案

LSP 意味着您可以在需要基类实例 的任何地方使用任何子类实例。并不是说您可以在您的代码中任意更改类名称,就像在您的“catch”示例中一样。否则,OO 程序将不可写。

你的第二个例子只是不正确。 “throws Exception”可以被Exception 的任何子类替换。这并不是说它是 LSP 的一个例子。

关于java - Exception Java API 是否违反了 Liskov 原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25840461/

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