gpt4 book ai didi

java - 编译器未在已检查的异常上显示任何错误

转载 作者:行者123 更新时间:2023-11-30 06:49:36 25 4
gpt4 key购买 nike

我正在处理已检查的异常,在此期间发现了一个情况,即编译器未在已检查的异常上显示任何错误并且工作正常。

import java.io.FileNotFoundException;

interface A {
void f() throws FileNotFoundException;
}

interface B {
void f() throws InterruptedException;
}

interface C extends A, B {
}

public class Test implements C {
public void f() {
System.out.println("Hello world");
}

public static void main(String[] args) {
C obj = new Test();
obj.f(); // Working fine and printing "Hello World"
}
}

请告诉我原因,我用谷歌搜索了很多但没有找到任何东西。

最佳答案

在面向对象的术语中,当您对接口(interface)进行编程时(即实现接口(interface)或扩展接口(interface)),您不能比接口(interface)更严格。但是,您可以放宽限制。因此,在您的示例中,接口(interface)的方法可能会或可能不会抛出 FileNotFoundException 和/或 InterruptedException,但您的实现方法不会抛出异常。请注意,如果您的实现方法抛出 FileNotFoundException 和/或 InterruptedException,那是完全没问题的,但如果它抛出一些其他异常,则不允许。这意味着您的实现可以等于或小于接口(interface)的限制,但不能比接口(interface)更严格。

另请注意,当有人通过扩展接口(interface)类型 (C) 的变量或通过类类型 (Test) 的变量使用您的方法 f() 时,他们不需要处理异常。但是,如果他们通过接口(interface)类型 A 或 B 的变量使用您的方法 f(),则他们需要处理异常。

A obj = new Test(); 
obj.f(); // need to handle FileNotFoundException

B obj = new Test();
obj.f(); // need to handle InterruptedException

C obj = new Test();
obj.f(); // don't need to handle any of the exceptions

Test obj = new Test();
obj.f(); // don't need to handle any of the exceptions

更多说明:C.f() 不抛出异常的原因是它的父接口(interface)抛出不同的异常。因此,根据“接口(interface)的实现或扩展不能限制更多但可以限制更少”的论点,C.f() 限制更少的唯一方法是不抛出异常。否则,它将至少比它的父接口(interface)之一更具限制性。另一方面,如果 C 的两个父对象抛出相同的异常,那么 C.f() 也需要抛出这些异常。但是,实现仍然可以选择不抛出异常。

import java.io.FileNotFoundException;

interface A{
void f() throws FileNotFoundException;
}

interface B {
void f() throws FileNotFoundException;
}

interface C extends A, B {
}

public class Test implements C {
public void f() {
System.out.println("Hello world");
}

public static void main(String[] args) {
C obj = new Test();
obj.f(); // Compilation error, unhandled exception

Test obj = new Test();
obj.f(); // No error
}
}

关于java - 编译器未在已检查的异常上显示任何错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42550454/

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