在Java中,重写方法时,能否将throws子句中声明的异常类型从非检查型异常改为检查型异常?


检查型异常是在编译时发生的异常,也称为编译时异常。在编译时不能简单地忽略这些异常;程序员应该处理这些异常。

非检查型异常是在运行时发生的异常,也称为运行时异常。这些异常包括编程错误,例如逻辑错误或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 Auto-generated method stub
      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

更新于:2020年6月29日

461 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告