2

try-catch 블록에 대해 공부하고 있습니다. 여기에 우리는 심지어 우리가trycatch 블록에서 NullPointerException이 발생했습니다.

Exception e = new NullPointerException(); 

을 할당 할 수 있습니다 그리고 BlewIt 클래스는 다시 형의 예외 클래스입니다, 파열() 에 의해 NullPointerException이 던져. 그래서 throw하는 예외는 catch 블록에서 catch해야하지만 그렇지 않습니다.

class BlewIt extends Exception { 
    BlewIt() { } 
    BlewIt(String s) { super(s); } 
} 
class Test { 
    static void blowUp() throws BlewIt { 
     throw new NullPointerException(); 
    } 
    public static void main(String[] args) { 
     try { 
      blowUp(); 
     } catch (BlewIt b) { 
      System.out.println("Caught BlewIt"); 
     } finally { 
      System.out.println("Uncaught Exception"); 
     } 
    } 
} 

출력 :

Uncaught Exception 
Exception in thread "main" java.lang.NullPointerException 
     at Test.blowUp(Test.java:7) 
     at Test.main(Test.java:11) 

그러나이 같은 코드를 작성하는 경우, 그것은 잘 작동 :

try { 
    blowUp(); 
    } catch (Exception b) { 
     System.out.println("Caught BlewIt"); 
    } finally { 
     System.out.println("Uncaught Exception"); 
    } 

이제 BlewIt는 NullPointerException이 유형이다하지만 여전히 내가 같은 출력을 얻고있다.

class BlewIt extends NullPointerException { 
    BlewIt() { 
    } 

    BlewIt(String s) { 
     super(s); 
    } 
} 


class Test { 
    static void blowUp() throws BlewIt { 
     throw new NullPointerException(); 
    } 

    public static void main(String[] args) { 
     Exception e = new NullPointerException(); 
     try { 
      blowUp(); 
     } catch (BlewIt b) { 
      System.out.println("Caught BlewIt"); 
     } finally { 
      System.out.println("Uncaught Exception"); 
     } 
    } 
} 

개념을 정리하는 데 도움을주십시오.

+0

'BlewIt'이 'Exception'이라는 이유로 'NullPointerException' 유형이'BlewIt '이 아니라는 뜻입니다. –

+0

@ TobiasBrösamle이 빠른 답장을 보내 주셔서 감사합니다. 당신이 지적했습니다. 다른 것을 시도하고 더 많은 코드를 추가했습니다. – sparsh610

+0

@ TobiasBrösamle BlewIt은 이제 NullPointerException 유형이지만 여전히 동일한 출력을 얻고 있습니다. – sparsh610

답변

3

NullPointerExceptionBlewIt의 하위 클래스가 아닙니다. 따라서 BlewIt을 붙잡는 것은 NullPointerException을 잡지 않습니다.

BlewIt을 잡으려면 throw new BlewIt()blowUp()으로 설정해야합니다.

1

당신은 NullPointerException을 던지고있다 당신의 catch 블록은 BlewIt 그렇게 직접적 NullPointerException의 스택 트레이스를 finally 블록 및 인쇄 캐치되지 않는 예외로 이동 잡고있다.

catch 블록은 BlewIt 및 그 하위 유형의 예외 만 catch합니다.

편집

class BlewIt extends NullPointerException 

BlewItNullPointerException하지 그 반대의 서브 클래스를 만들 것입니다. BlewIt이 예외를 확장 할 때 그래서 당신은 여전히 ​​단순히 물건을 넣으려면 BlewIt

1

에 의해 NullPointerException를 잡을 수 없습니다, BlewIt 예외의 서브 클래스되고, 그것이 NullPointerException이 잡을 것을 의미하지는 않습니다.

static void blowUp() throws BlewIt { 
    throw new NullPointerException(); 
} 

그러나 NullPointerException은 확인 된 예외가 아니므로 코드가 컴파일됩니다.

그러나 나중에 코드에서 NullPointer 예외를 throw하고 catch 블록을 통해 catch하려고하면 예상대로 catch를 catch하지 않습니다.

관련 문제