在 Java 中重写带有 throws 子句的方法时,我们能否将其异常从"未检查"更改为"已检查"?
java 8object oriented programmingprogramming
已检查异常是在编译时发生的异常,也称为编译时异常。这些异常在编译时不能被忽略;程序员应该注意(处理)这些异常。
未检查异常是在执行时发生的异常。这些也称为运行时异常。这些包括编程错误,例如逻辑错误或 API 的不当使用。运行时异常在编译时被忽略。
未检查到已检查
当超类中的方法抛出未检查异常时,子类方法重写的方法不能抛出已检查异常。
示例
在下面的例子中,我们在名为 Super 的类中有一个名为抽象方法,它抛出未检查异常 (ArithmeticException)。
在子类中,我们重写此方法并抛出已检查异常 (IOException)。
import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Scanner; import java.io.InvalidClassException; abstract class Super { public abstract String readFile(String path) throws ArithmeticException; } public class ExceptionsExample extends Super { @Override public String readFile(String path) throws FileNotFoundException { // TODO 自动生成的方法存根 return null; } }
输出
ExceptionsExample.java:12: error: readFile(String) in ExceptionsExample cannot override readFile(String) in Super public String readFile(String path) throws FileNotFoundException { ^ overridden method does not throw FileNotFoundException 1 error
但是,当超类中的方法抛出已检查异常时,子类方法重写的方法可能会抛出未检查异常。
示例
在下面的示例中,我们只是交换了超类和子类中方法的异常。
import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Scanner; import java.io.InvalidClassException; abstract class Super{ public abstract String readFile(String path) throws FileNotFoundException ; } public class ExceptionsExample extends Super { @Override public String readFile(String path) throws ArithmeticException { // TODO Auto-generated method stub return null; } }
如果你编译上述程序,它将被编译并且不会出现编译时错误
输出
Error: Main method not found in class ExceptionsExample, please define the main method as: public static void main(String[] args) or a JavaFX application class must extend javafx.application.Application