2016-06-01 3 views
1

멀티 캐치 (Java 7 이상)를 사용하여 사용자 정의 예외 클래스를 생성합니다. 이것은 제가 만든 수업입니다.멀티 캐치에서 예외 클래스를 확인할 수 없습니다.

public class CustomException extends Exception{ 

public CustomException() { 
    System.out.println("Default Constructor"); 
} 
public CustomException(ArithmeticException e, int num){ 
    System.out.println("Divison by ZERO! is attempted!!! Not defined."); 
} 
public CustomException(ArrayIndexOutOfBoundsException e, int num){ 
    System.out.println("Array Overflow!!!"); 
} 
public CustomException(Exception e, int num){ 
    System.out.println("Error"); 
} 

및 위 클래스는 다음과 같은 클래스에서 확장 : 다음 코드를 참조하십시오.

import java.util.Scanner; 

public class ImplementCustomException extends CustomException { 

public static void main(String[] args) throws CustomException { 
    int num = 0; 
    System.out.println("Enter a number: "); 
    try(Scanner in = new Scanner(System.in);){ 

     num = in.nextInt(); 
     int a = 35/num; 

     int c[] = { 1 }; 
     c[42] = 99; 
    } 
    catch(ArithmeticException|ArrayIndexOutOfBoundsException e){ 

     throw new CustomException(e, num); 
    } 
} 
} 

나는 이것을 실행하려고 할 때마다 "예외"가있는 동일한 생성자를 호출합니다. 그 이유는 무엇입니까?

그러나 멀티 캐치 구문을 다음 코드로 바꿀 경우. 예상대로 작동하고 있습니다.

멀티 캐치를 사용하고 필요한 예외를 던질 수 있도록 가능한 변경 사항을 알려주십시오.

+0

'!!!'에 너무 익숙해지지 마십시오. 어떤 사람들에게는 눈살을 찌푸리게됩니다. – glglgl

+0

사이드 노트 : 사용자 정의 예외가 정보를 잃어 버리지 않도록 설정되어 있는지 확인하십시오. 내 말은 : 배열 인덱스를 벗어나서 커스텀 예외를 만들었지 만 코드에서 그 예외를 완전히 잊어 버리는 것이다. 의미 : 범위 밖의 배열 인덱스가 발생했음을 알았지 만 스택 추적 및 메시지가 없다면 나중에 문제를 디버그하는 것이 매우 어려울 것입니다 **. – GhostCat

답변

4

ArithmeticExceptionArrayIndexOutOfBoundsException의 공통 부모는 Exception이 아닙니다. 이 하나

catch(ArithmeticException|ArrayIndexOutOfBoundsException e){ 
    throw new CustomException(e, num); 
} 

e 정적 타입을 얻는다 차단 이것은 ExceptionRuntimeException이다. 이것으로 CustomException(Exception e, int num)이 호출됩니다.

위로 나누면 e에 더 많은 전용 유형이 있습니다.

+0

@JornVernee 맞아, 내가 바로 잡았어. 그러나 기본 문장은 동일하게 유지됩니다. – glglgl

3

동작이되지-매우-유명한 문장을 통해 JLS Sec 14.20에 정의되어

D1 | D2 | ... | Dnlub(D1, D2, ..., Dn) 인 대안을 가진 조합으로 유형을 나타냅니다 예외 매개 변수의 선언 된 유형.

lub

수단 "적어도 상한" JLS Sec 4.10.4 정의 :

최소 상부 바운드 또는 "LUB"참조 형식의 세트 중 하나 이상의 특정 공유 퍼 인 다른 공유 상위 유형 (즉, 공유 상위 상위 유형은 최소 상한의 부속 유형이 아 U니다). 귀하의 경우에는

ArithmeticExceptionlubArrayIndexOutOfBoundsExceptionRuntimeException, 그래서 매개 변수 유형으로 Exception을 복용 과부하 호출 할 수있는 가장 구체적인 방법입니다.

컴파일러은 호출 할 오버로드를 결정한다는 것을 기억하십시오. 런타임에 결정되지 않습니다.