2012-05-13 2 views
11

던져려고 시도하는 동안 내 던져진 사용자 지정 예외를 try/catch으로 바꾸어야하는 이유는 무엇입니까? 그렇지만 일반적인 예외에 대해서는이를 수행 할 필요가 없습니다. 이 예에서와 마찬가지로, 내 Exception 서브 클래스 :Java에서 사용자 지정 예외 throw

public class MyException extends Exception { 
    public MyException(String msg) { 
     super(msg); 
    } 
} 

던지는 예외 : 당신이 방법을 (던져하지를하려는 경우

public class Exe { 

    private static void testex(String test) { 
     if (null!=test) { 
      throw new UnsupportedAddressTypeException(); 
     } else {//Removing try/catch block results in compile failure 
      try { 
      throw new MyException("message"); 
      } catch (MyException e) { 
      e.printStackTrace(); 
      } 
     } 
    } 
} 
+1

Java 자습서의 [검사되지 않은 예외] (http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html)를 참조하십시오. – McDowell

답변

15

UnsupportedAddressTypeException이의 RuntimeException의 서브 클래스에 필요하지 에 단어를 변경하고, JavaDoc의 주석 :

의 RuntimeException 그 예외의 슈퍼 클래스입니다 Java 가상 머신의 통상의 조작 중에 슬로우 될 가능성이 있습니다.

메서드 실행 중에 throw 될 수 있지만 catch되지 않은 RuntimeException 하위 클래스를 throws 절에 선언 할 필요는 없습니다. Java Tutorial에서

+0

아, 나는 질문자가 묻는 것을 실제로 추측했다고 생각한다. 나는 체크 한 것과 체크하지 않은 것에 대한 구분보다는 "내게 왜 내 자신의 예외를 잡아 주는가"에 초점을 맞추었다. – andersoj

7

정적 방법은

private static void testex(String test) throws MyException 

를 선언해야 붙잡고 그것을 내부적으로 취급하십시오).

12

예외가 java.lang.Exception을 확장하는 경우이를 catch하거나 다시 throw해야합니다. java.lang.RuntimeException을 확장하면 그렇게 할 필요가 없습니다. 모든 표준 예외에 대해서도 마찬가지입니다.

편집해야하지

+0

'RuntimeException'을 확장하면 * catch * 할 필요가 없지만 그렇게 할 자유는 있습니다. – andersoj

+0

참. "~해서는 안된다"는 가난한 단어들이었다. langugage issue ... –

0

: 캐치 명예 또는 요구 사항을 지정해야합니다

유효한 Java 프로그램 언어 코드입니다. 예외를 catch

  • try 문 :이 특정 예외를 던질 수있는 그 코드 해야 다음 중 하나에 의해 둘러싸인 수를 의미한다. try는 예외 잡기 및 처리에 설명 된대로 예외에 대한 처리기를 제공해야합니다.

  • 예외를 throw 할 수 있음을 지정하는 메서드입니다. 메서드는 메서드에서 throw 된 예외 지정에 설명 된대로 예외를 나열하는 throws 절을 제공해야합니다. 실패

코드는 캐치를 존중하거나 요구하지 않습니다 컴파일을 지정합니다. 모든 예외가 Catch 나 Require Requirement의 대상이되는 것은 아닙니다.

[...]

런타임 예외는 캐치 적용되지 않습니다 또는 요구 사항을 지정합니다. 런타임 예외는 RuntimeException 및 해당 하위 클래스가 나타내는 예외입니다.

관련 문제