2009-11-25 2 views
2

InvalidResourceException이 ResourceException의 서브 클래스라고 가정하십시오. 두 가지 방법을 정의합니다Java catch 블록은 정적 바인딩을 사용합니까?

void handleException(ResourceException e) { 
    System.out.println("ResourceException " + e.toString()); 
} 
void handleException(InvalidResourceException e) { 
    System.out.println("InvalidResourceException " + e.toString()); 
} 

이제 다음 코드 :

인쇄이 :

ResourceException: com.myPackage.InvalidResourceException: invalid resource 

을하지만, 다음 코드를

try { 
    throw new InvalidResourceException("invalid resource"); 
    } catch (InvalidResourceException e) { 
    handleException(e); 
    } catch (ResourceException e) { 
    handleException(e); 
    } 

인쇄이 :

InvalidResourceException: com.myPackage.InvalidResourceException: invalid resource 

이것은 Sun의 JDK 1.5.0_15입니다.

Java 표준과 일치합니까?

이 코드는 어떻게해야합니까?

Exception e = new InvalidResourceException("invalid resource"); 
handleException(e); 

이 코드는 어떻게해야합니까?

Exception e = new InvalidResourceException("invalid resource"); 
if (e instanceOf ResourceException) { 
    handleException(e); 
} else if (e instanceOf InvalidResourceException) { 
    handleException(e); 
} else { 
    handleException(e): 
} 
+0

이 동작은 나에게 유용하게 보입니다. –

답변

11

예. 맞습니다. 오버로드는 항상 정적으로 해결됩니다.

e의 정적 유형이 Exception이므로 후자의 두 예제 중 어느 것도 컴파일되지 않으며 과부하도 해당 유형을 허용하지 않습니다.

편집 : 당신의 마지막 예제 정말 try/catch 블록에 직접 아날로그하지

참고. try/catch에는 e이라는 두 개의 변수가 있습니다. 각각의 catch에 하나씩이고 각각 ​​정적 유형은 InvalidResourceExceptionResourceException입니다. 마지막 예에서는 e이라는 단일 변수가 있고 정적 유형은 Exception입니다. 새 변수를 추가하고 캐스트를 사용하여 할당 한 경우 try/catch와 동일한 동작을 얻을 수 있습니다 (최종 else 분기를 잃어 버리지 만).

+0

오버로드를 해결하는 것은 단순히 "정적"인 것보다 조금 더 복잡합니다. 동적 인 측면도 있습니다. 자세한 내용은 를 참조하십시오. –

+0

* 메소드 호출 * (링크 된 JLS 섹션)에 동적 측면이 있지만 * 과부하 해결 *은 엄격하게 정적 (즉 : 컴파일 타임) 작업입니다. 사실 링크 된 JLS의 일부는이를 백업합니다. 오버로드를 언급하는 유일한 부분 (시작 부분의 개요는 15.12.2, "컴파일 타임 2 단계 : 메소드 서명 결정")입니다. –

1

질문의 첫 번째 부분에 대해 올바른 호출 방법은 변수가 선언 된 형식에 따라 컴파일 타임에 결정됩니다. 예 : catch 문을 변경하여 InvalidResourceException을 catch하면 handleException (InvalidResourceException) 오버로드가 대신 호출됩니다.

질문의 두 번째 부분에 대해서는 JVM이 던져진 예외를 처리 할 수있는 첫 번째 catch 문을 간단히 찾습니다. 대신에 ResourceException을 던지려면 두 번째 catch 블록이 실행됩니다.

일반 예외를 처리하기위한 적절한 handleException() 메서드가 없으므로 세 번째 부분은 컴파일되지 않습니다.

마지막 파트도 세 번째 파트와 같은 이유로 컴파일되지 않습니다.

0

java에서 지원하지 않는 "이중 발송"이 필요합니다.

관련 문제