Java 中方法重写时异常处理的规则是什么?


当重写一个抛出异常的父类方法时,需要遵循某些规则。

应该抛出相同的异常或子类型异常

如果父类方法抛出某些异常,则子类中的方法应该抛出相同的异常或其子类型异常。

示例

在以下示例中,父类的 readFile() 方法抛出 IOEXception,而子类的 readFile() 方法抛出 FileNotFoundException 异常。

由于 FileNotFoundException 异常是 IOException 的子类型,因此该程序可以编译并执行,没有任何错误。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
abstract class Super {
   public String readFile(String path) throws IOException {
      throw new IOException();
   }
}
public class ExceptionsExample extends Super {
   @Override
   public String readFile(String path) throws FileNotFoundException {
      Scanner sc = new Scanner(new File("E://test//sample.txt"));
      String input;
      StringBuffer sb = new StringBuffer();
      while (sc.hasNextLine()) {
         input = sc.nextLine();
         sb.append(" "+input);
      }
      return sb.toString();
   }
   public static void main(String args[]) {
      String path = "E://test//sample.txt";
      ExceptionsExample obj = new ExceptionsExample();
      try {
         System.out.println(obj.readFile(path));
      }catch(FileNotFoundException e) {
         System.out.println("Make sure the specified file exists");
      }
   }
}

输出

Tutorials Point is an E-learning company that set out on its journey to provide knowledge to that class of readers that responds better to online content. With Tutorials Point, you can learn at your own pace, in your own space. After a successful journey of providing the best learning content at tutorialspoint.com, we created our subscription based premium product called Tutorix to provide Simply Easy Learning in the best personalized way for K-12 students, and aspirants of competitive exams like IIT/JEE and NEET.

示例

同样,如果子类抛出与父类相同的异常,则程序可以编译并成功执行。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
abstract class Super {
   public void sampleMethod()throws FileNotFoundException {
      System.out.println("Method of superclass");
   }
}
public class ExceptionsExample extends Super {
   public void sampleMethod()throws FileNotFoundException {
      System.out.println("Method of Subclass");
   }
   public static void main(String args[]) {
      ExceptionsExample obj = new ExceptionsExample();
      obj.sampleMethod();
   }
}

输出

Method of Subclass

不应抛出父类型异常

如果父类方法抛出某些异常,则子类中的方法不应抛出其父类型异常。

示例

在以下示例中,父类的 readFile() 方法抛出 FileNotFoundException 异常,而子类的 readFile() 方法抛出 IOException,它是 FileNotFoundException 的父类型。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
abstract class Super {
   public String readFile(String path)throws FileNotFoundException {
      throw new FileNotFoundException();
   }
}
public class ExceptionsExample extends Super {
   @Override
   public String readFile(String path)throws IOException {
      //method body ......
   }
}

编译时错误

编译时,上述程序会给出以下输出:

ExceptionsExample.java:13: error: readFile(String) in ExceptionsExample cannot override readFile(String) in Sup
   public String readFile(String path)throws IOException {
                 ^
   overridden method does not throw IOException
1 error

不抛出任何异常

如果父类方法抛出某些异常,则可以重写它而不抛出任何异常。

示例

在以下示例中,父类的 sampleMethod() 方法抛出 FileNotFoundException 异常,而 sampleMethod() 方法根本不抛出任何异常。尽管如此,该程序仍可以编译并执行,没有任何错误。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
abstract class Super {
   public void sampleMethod()throws FileNotFoundException {
      System.out.println("Method of superclass");
   }
}
public class ExceptionsExample extends Super {
   public void sampleMethod() {
      System.out.println("Method of Subclass");
   }
   public static void main(String args[]) {
      ExceptionsExample obj = new ExceptionsExample();
      obj.sampleMethod();
   }
}

输出

Method of Subclass

更新时间: 2019年10月10日

653 次浏览

开启你的 职业生涯

完成课程获得认证

开始学习
广告