Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바에서 오버라이딩한 메서드가 부모 메서드가 던지는 예외의 상위 타입을 던질 수 있을까?


자바에서는 메서드 오버라이딩 시 예외 선언에 중요한 규칙이 적용됩니다. 슈퍼 클래스(부모 클래스)의 메서드가 특정 예외를 던지도록 선언되어 있다면, 이를 오버라이딩하는 서브 클래스(자식 클래스)의 메서드는 해당 예외의 상위(부모) 타입 예외를 던질 수 없습니다. 동일한 예외 또는 그 하위 타입의 예외만 선언할 수 있습니다.

예제 코드

다음 예제에서 슈퍼 클래스의 readFile() 메서드는 FileNotFoundException 예외를 던지도록 선언되어 있습니다. 그런데 서브 클래스에서 오버라이딩한 readFile() 메서드는 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 FileNotFoundException {
       throw new FileNotFoundException();
   }
}

public class ExceptionsExample extends Super {
   @Override
   public String readFile(String path) throws IOException {
       // 메서드 본문 ......&nbs p;
   }
}

컴파일 타임 에러

위 프로그램을 컴파일하면 다음과 같은 오류 메시지가 출력됩니다.

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

왜 이런 규칙이 필요할까?

이 규칙은 다형성(polymorphism) 때문입니다. 슈퍼 클래스 타입의 참조로 객체를 사용하는 코드는 해당 클래스에 선언된 예외만 catch 블록으로 처리하면 된다고 가정합니다. 만약 서브 클래스가 더 넓은 범위의 상위 타입 예외를 던질 수 있다면, 호출 측 코드가 감당하지 못하는 새로운 예외가 발생해 프로그램의 안정성이 깨질 수 있습니다. 따라서 자바는 오버라이딩 메서드가 부모 메서드보다 같거나 더 구체적인(하위 타입) 예외만 던지도록 제한합니다.

올바른 예외 선언 방법

오버라이딩하는 메서드의 throws 절에는 다음 중 하나만 허용됩니다.

  • 체크 예외를 전혀 선언하지 않는 경우
  • 부모 메서드와 동일한 예외를 선언하는 경우 (예: FileNotFoundException)
  • 부모 메서드가 선언한 예외의 하위 타입을 선언하는 경우

참고로 RuntimeException처럼 언체크(Unchecked) 예외는 이 규칙의 영향을 받지 않으므로 자유롭게 던질 수 있습니다.