当前位置: 首页 > 面试题库 >

重写的方法无法引发Java异常

巴帅
2023-03-14
问题内容

这是我的代码块。

class Alpha{
    public void Gamma() {
        System.out.println("Alphas");
    }
}

class Beta extends Alpha{
    public void Gamma() throws Exception //Line 1
    {
        try {
            System.out.println("Betas");
        } catch(Exception e) {
            System.out.println("Exception caught");
        } finally {
            System.out.println("xfg");
        }
    }
    public static void main(String[] args) throws Exception {
        Alpha g = new Beta();
        g.Gamma();
    }
}

这段代码无法编译,因为我在Line1中添加了“ throws”。

编译器抱怨重写的方法不能引发html" target="_blank">异常。

为什么这样 ?。

为什么覆盖的方法不能引发异常?

因为我可以通过在子类的实现中添加n行代码来覆盖基类中的方法。

这些添加的代码会引发异常,所以为什么我不能在重写的方法中使用“引发”?


问题答案:

重写的方法可以引发Exception,只要被重写的方法也抛出相同的Exception。您不能 引入 新的例外。

那么,为什么不能引入新的Exception?

OOP的中心概念之一是使用抽象类型,并且所有子类型都可以视为抽象类型。参见里斯科夫替代原理

您不能引入更广泛的行为的原因是,如果抽象类型(超类或接口)中的方法未引发Exception并且您将对象引用为该类型,则可能会出现意外的行为:

Alpha alpha = new Beta();
// At this point, the compiler knows only that we have an Alpha
alpha.myMethod();

如果阿尔法的myMethod()不抛出一个异常,但测试版的 ,我们可以得到在上面的代码意外的异常。



 类似资料:
  • 问题内容: 在Java线程中,“运行”方法不能引发“检查的异常”。我在Core Java(第1卷)书中遇到了这个问题。有人可以解释其背后的原因吗? 问题答案: 有人可以解释其背后的原因吗? 是的,因为您抛出的任何异常都会被JVM仔细忽略。因此,将其抛出可能是一个错误(除非您对该线程具有特定的异常处理程序,请参阅有关该文档的文档)。没有理由煽动潜在的错误行为。 或者举个例子。 编辑 为什么父线程不能

  • 下面是这本书的一段话: 覆盖方法不得抛出比覆盖方法声明的异常新的或更广泛的检查异常。例如,声明FileNotFoundException的方法不能被声明SQLException、Exception或任何其他非运行时异常的方法覆盖,除非它是FileNotFoundException的子类。 现在我的问题是,如果超类中的方法抛出一个异常,那么重写方法能否根本不抛出一个异常? 因为我刚刚在Java中尝试

  • 我无法在Spring中捕获异步方法抛出的异常。我已经编写了一个未捕获的异常处理程序来捕获,但没有成功。该应用程序将启用启动任意数量的永远运行的异步作业。我认为我的异步方法需要返回Future,以便我可以将其存储在hashmap中并检查其状态或停止作业。我也可以通过存储它来获取所有正在运行的作业。我认为我不能使用get method of Future,因为如果输入正确,它会阻塞,我的作业将永远运行

  • Main.java:12:错误:TextMessage不是抽象的,并且不会覆盖Message类中的抽象方法setContent(T)TextMessage扩展Message{^其中T是类型变量:T扩展方法setContent(T)中声明的Object 1错误

  • 在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为 方法重写(override),又称为 方法覆盖。当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写。 子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。 在重写方法时,需要遵循

  • 为什么在使用java可选方法时,不能在orElse部分抛出选中的异常? 例如: 其中是扩展类的自定义异常(检查异常)。 但是这段代码让编译器感到不安: (知道它已经在方法声明中抛出,并且用try-catch包围这个块并不能解决编译问题)。 但是,如果我们使扩展(未选中),那么所有工作都完美。 有人知道为什么吗? 在这个java 9可选方法中阻止抛出此类异常的原因是什么? 为什么我要将我的异常设置为