Java中使用方法重写进行异常处理

时间:2020-01-09 10:34:57  来源:igfitidea点击:

在子类中,我们可以覆盖超类的方法并提供不同的实现。但是,如果超类中的该方法使用throws子句声明异常,该怎么办。子类中的重写方法是否也继承那些异常声明,可以在重写方法中重写那些异常。让我们尝试通过Java中的方法重写在此异常处理后找到这些问题的答案。

在通过方法重写进行异常处理的情况下遵循的规则

在覆盖一种方法时,有一些Java异常处理规则,具体如下:

  • 如果超类中的方法未声明任何异常,则子类中被重写的方法尽管可以声明未检查的异常,但无法声明任何检查的异常。
  • 如果超类中的方法有一些使用throws子句声明的异常,则子类重写方法中有三个选项。子类方法可以声明与父类方法相同的异常。
  • 子类方法可以声明父类方法中声明的异常的任何子异常。但是它不能在层次结构中声明更高的任何异常。例如,如果父类方法声明IOException,则子类方法可以声明FileNotFoundException,因为FileNotFoundException是IOException的子类。但是尝试使用子类方法声明Exception会导致错误,因为Exception类是IOException的父类。
  • 覆盖的子类方法根本不会声明任何异常。

异常处理方法重写示例

让我们看一下上面概述的场景的一些例子,以使其更清楚。

如果超类中的方法未声明任何异常

在这里,我们有一个Shape类,它是一个父类,它具有一个area()方法。有一个子类Circle,其中area()方法被覆盖。如果子类Circle中的area()方法使用throws子句声明了IllegalArgumentException,则不会出错,因为IllegalArgumentException是未经检查的异常。

class Shape {
	public void area(int side){
		System.out.println("Calculate area");
	}
}
public class Circle extends Shape {
	// Overridden method
	public void area(int radius) throws IllegalArgumentException{
		System.out.println("Calculate area");
		double area = Math.PI * Math.pow(radius, 2);
		System.out.println("Circle area " + area);
	}
	public static void main(String[] args) {
		Shape shape;
		shape = new Circle();
		shape.area(5);		
	}
}

如果将声明的异常更改为ParseException,则将收到编译器错误,因为ParseException是已检查的异常。

如果超类中的方法声明了异常

现在,让我们看看超类方法声明异常时的可能性。

1子类重写方法可以声明一个异常,它是超类方法的子类型。

class Read {
  public void readFile() throws IOException{
    System.out.println("read file");
  }
}
public class FileRead extends Read {
  // Overridden method
  public void readFile() throws FileNotFoundException{
    File file = new File("D://test.txt");
    BufferedReader br = new BufferedReader(new FileReader(file));
  }
  public static void main(String[] args) {
    FileRead fr = new FileRead();
    try {
      fr.readFile();
    } catch (FileNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

在上面的父类Read中的代码中,有一个方法readFile()声明了IOException。我们将在子类FileRead中重写此方法,并在其中声明FileNotFoundException。可以,因为FileNotFoundException是IOException的子类。

在子类方法中,如果将抛出的异常更改为Exception,则由于Exception是IOException的超级类型,因此将收到错误消息。

public void readFile() throws Exception{
	File file = new File("D://test.txt");
	BufferedReader br = new BufferedReader(new FileReader(file));
}

输出:

Exception Exception is not compatible with throws clause in Read.readFile()
FileRead.java

2子类重写方法完全不引发任何异常,这也可以。

class Read {
	public void readFile() throws IOException{
		System.out.println("read file");
	}
}
public class FileRead extends Read {
	// Overridden method
	public void readFile(){
		File file = new File("D://test.txt");
	    try {
			BufferedReader br = new BufferedReader(new FileReader(file));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		FileRead fr = new FileRead();
		fr.readFile();
		
	}
}

子类中的readFile()方法并未声明任何异常,尽管父类方法却声明了任何异常。

3Sub类方法抛出的异常与父类方法相同。

class Read {
	public void readFile() throws IOException{
		System.out.println("read file");
	}
}
public class FileRead extends Read {
	// Overridden method
	public void readFile() throws IOException{
		File file = new File("D://test.txt");
		BufferedReader br = new BufferedReader(new FileReader(file));
	}
	public static void main(String[] args) {
		FileRead fr = new FileRead();
		try {
			fr.readFile();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
}

主题为Java中的方法异常处理。如果缺少某些内容,或者我们需要分享一些有关此主题的信息,请发表评论。