Java에서 사용자 정의 예외를 작성하는 방법은 무엇입니까? [닫은]


149

Java에서 사용자 정의 예외를 작성하는 방법


2
대부분의 OO 언어에서 사용되는 것과 동일한 방법으로 기본 Exception 클래스를 확장합니다.
NDM


1) // 사용 정의 된 예외 클래스를 나타내는 클래스 MyException extends Exception {public MyException (String s) {super (s); }} ------------------------------------------------ 2) try {// 사용자 정의 예외의 개체를 던집니다. throw my MyException ( "TestException"); } catch (MyException ex) {System.out.println ( "Caught"); // MyException 객체에서 메시지를 인쇄합니다. System.out.println (ex.getMessage ()); }
Mandeep Yadav 2016 년

답변:


285

점검 된 예외 를 정의하려면 의 서브 클래스 (또는 서브 클래스 계층)를 작성하십시오 java.lang.Exception. 예를 들면 다음과 같습니다.

public class FooException extends Exception {
  public FooException() { super(); }
  public FooException(String message) { super(message); }
  public FooException(String message, Throwable cause) { super(message, cause); }
  public FooException(Throwable cause) { super(cause); }
}

이 예외를 던지거나 전파 할 수있는 메소드는 다음을 선언해야합니다.

public void calculate(int i) throws FooException, IOException;

...이 메소드를 호출하는 코드는이 예외를 처리하거나 전파해야합니다 (또는 둘 다).

try {
  int i = 5;
  myObject.calculate(5);
} catch(FooException ex) {
  // Print error and terminate application.
  ex.printStackTrace();
  System.exit(1);
} catch(IOException ex) {
  // Rethrow as FooException.
  throw new FooException(ex);
}

위의 예에서 IOException로 잡히고 다시 던져지는 것을 알 수 FooException있습니다. 이것은 일반적으로 API를 구현할 때 예외를 캡슐화하는 데 사용되는 일반적인 기술입니다.

때로는 모든 메소드가 throws 절에 예외 구현을 선언하도록 강요하지 않는 상황이있을 수 있습니다. 이 경우 검사되지 않은 예외를 만들 수 있습니다 . 검사되지 않은 예외는 확장 java.lang.RuntimeException되는 예외입니다 (자체 하위 클래스 임 java.lang.Exception).

public class FooRuntimeException extends RuntimeException {
  ...
}

메소드는 FooRuntimeException예외를 선언하지 않고 예외를 던지거나 전파 할 수 있습니다 . 예 :

public void calculate(int i) {
  if (i < 0) {
    throw new FooRuntimeException("i < 0: " + i);
  }
}

검사되지 않은 예외는 일반적으로 프로그래머 오류를 표시하는 데 사용됩니다 (예 : 유효하지 않은 인수를 메소드에 전달하거나 배열 색인 경계를 위반하려는 시도).

java.lang.Throwable클래스는 Java 내에서 발생할 수있는 모든 오류 및 예외의 근본입니다. java.lang.Exception그리고의 java.lang.Error서브 클래스입니다 Throwable. 서브 클래스 Throwable가 발생하거나 잡힐 수 있습니다. 그러나 일반적으로 Error프로그래머가 처리 할 수없는 JVM 내부 오류 (예 :)를 나타내는 데 사용되므로 일반적으로 catch 또는 throw하는 것은 좋지 않습니다 OutOfMemoryError. 마찬가지로을 잡는 것을 피해야합니다. Throwable이 경우 Errors 외에을 잡을 수도 있습니다 Exception.


25
public class MyException extends Exception {
        // special exception code goes here
}

그것을 다음과 같이 던져라 :

 throw new MyException ("Something happened")

다음과 같이 잡기 :

catch (MyException e)
{
   // something
}

4

확인 된 예외의 경우 :

public class MyCustomException extends Exception { }

기술적 Throwable으로 확장하는 것은 던져 질 수 있지만 예외는 일반적으로 Exception클래스의 확장 이므로 예외를 확인합니다 (런타임 예외 또는 클래스를 기반으로 한 클래스는 제외). Error일반적으로 JVM 내부를 넘어 정상적으로 처리되도록 설계된 것은 아닙니다.

공개를 예외로 만들 수도 있지만 패키지 전체와 달리 예외를 정의하는 패키지에서만 예외를 사용할 수 있습니다.

맞춤 예외를 던지거나 잡는 한 내장 예외와 동일하게 작동합니다.

throw new MyCustomException()

를 통해 잡아

catch (MyCustomException e) { }

4
RuntimeException은 Exception을 확장하며 확인 된 예외가 아닙니다.
Adamski

2
기술적으로 확장되는 Throwable것은 던져 질 수 있습니다 . 예외 연장 Exception. Throwable의 사용자 정의 서브 클래스는 try { ... } catch (Exception e) { ... }블록에 걸리지 않습니다 .
Andrzej Doyle

사람들이 왜이 답변을지지합니까? 약간의 부정확 함이 포함되어 있습니다. 1) 인터페이스이므로 던지기 불가능 합니다. 2) Throwable 을 확장 하는 것은 예외 가 아닙니다 (예외 Error가 아니며 오류입니다). 3) RuntimeException이 아닌 Exception의 서브 클래스가 점검됨을 의미합니다. Adamski의 답변이 훨씬 정확합니다!
oxbow_lakes

죄송합니다. Throwable은 물론 인터페이스 가 아닙니다 !
oxbow_lakes

@oxbow_lakes-이상적인 해결책은 부정확성을 수정하는 것입니다. 어쨌든 다른 사람이 없었기 때문에 직접 수정했습니다.
Amber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.