가장 쉬운 방법은 Java에서 사용자 정의 예외 클래스를 정의하는 방법은 무엇입니까?


286

내 자신의 예외 클래스를 가장 쉬운 방법으로 정의하려고하는데 이것이 내가 얻는 것입니다.

public class MyException extends Exception {}

public class Foo {
  public bar() throws MyException {
    throw new MyException("try again please");
  }
}

이것은 Java 컴파일러가 말하는 것입니다.

cannot find symbol: constructor MyException(java.lang.String)

이 생성자가에서 상속 받아야한다는 느낌 java.lang.Exception이 들지 않습니까?

답변:


402

아니요, 기본이 아닌 생성자를 "상속"하지 않으므로 클래스에서 문자열을 사용하는 생성자를 정의해야합니다. 일반적으로 super(message)생성자에서 부모 생성자를 호출하는 데 사용합니다. 예를 들면 다음과 같습니다.

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

58
@vulkanino : 아니요. 기본 생성자는 자체 생성자를 정의하지 않는 모든 클래스에 대해 컴파일러에 의해 추가됩니다. 명시 적 생성자를 정의하면 수퍼 클래스에 기본값이 있어도 기본값을 얻지 못하고 클래스에 생성자가없는 경우 수퍼 클래스에없는 경우에도 기본값을 얻습니다.
Michael Borgwardt

5
if your class has no constructor, you get the default even if the superclass does not have it수퍼 클래스에이 클래스에 액세스 할 수있는 기본 생성자가없는 경우 마지막 부분은 불가능합니다 (보호되거나 패키지로 보호 될 수 있음). 그렇지 않으면 부모 생성자 중 하나를 명시 적으로 호출해야합니다. 그렇지 않으면 컴파일이 실패합니다.
Sean Patrick Floyd

43
예외 체인 을 올바르게 지원 하려면 MyException(Throwable)MyException(String, Throwable)생성자를 추가하십시오 .
Danilo Piazzalunga

8
거의 3 년 후 추가 생성자는 추가되지 않았습니다. :(
byxor

2
@BrandonIbbotson '그들'은 무엇을 의미하며 어디에 추가됩니까? 'they'가 의미하는 것이 수퍼 클래스 생성자이고 'where'가 서브 클래스이면 잘못된 것입니다. 수퍼 클래스 생성자는 하위 클래스에 암시 적으로 추가되지 않습니다. 또한 나는 그 단어들이 언급 한 이전 문장에서 다른 주제를 볼 수 없습니다.
halil

90

내가 정의한 일반적인 사용자 정의 예외는 다음과 같습니다.

public class CustomException extends Exception {

    public CustomException(String message) {
        super(message);
    }

    public CustomException(String message, Throwable throwable) {
        super(message, throwable);
    }

}

Eclipse를 사용하여 템플릿을 작성하기 때문에 모든 내용을 반복해서 쓸 필요가 없습니다.


17
Eclipse에서 클래스를 만들 때 예외를 확장하면 4 개의 생성자를 모두 얻을 수 있습니다. 템플릿이 필요하지 않습니다.
jeremyjjbrown

첫 번째 대신 두 번째 Consutructor를 언제 사용해야합니까?
ZhaoGang

61

Eclipse에서 새 클래스 대화 상자를 사용하는 경우 java.lang.Exception수퍼 클래스 필드를 설정하고 "수퍼 클래스의 생성자"를 확인하면 다음이 생성됩니다.

package com.example.exception;

public class MyException extends Exception {

    public MyException() {
        // TODO Auto-generated constructor stub
    }

    public MyException(String message) {
        super(message);
        // TODO Auto-generated constructor stub
    }

    public MyException(Throwable cause) {
        super(cause);
        // TODO Auto-generated constructor stub
    }

    public MyException(String message, Throwable cause) {
        super(message, cause);
        // TODO Auto-generated constructor stub
    }

}

super()defualt 생성자를 호출하지 않는 것에 대한 아래 질문에 대한 응답으로 Oracle은 다음과 같이 말합니다 .

참고 : 생성자가 명시 적으로 수퍼 클래스 생성자를 호출하지 않으면 Java 컴파일러는 수퍼 클래스의 인수가없는 생성자에 대한 호출을 자동으로 삽입합니다.


1
기본 생성자가 호출 할 필요가없는 이유는 무엇 super()입니까?
12


22

이에 대한 이유 는 Java 플랫폼 의 상속 기사에 설명되어 있습니다 .

"하위 클래스는 수퍼 클래스에서 모든 멤버 (필드, 메소드 및 중첩 클래스)를 상속합니다. 생성자는 멤버 가 아니므로 서브 클래스에 의해 상속되지는 않지만 서브 클래스에서 수퍼 클래스의 생성자를 호출 할 수 있습니다."


19
package customExceptions;

public class MyException extends Exception{

    public MyException(String exc)
    {
        super(exc);
    }
    public String getMessage()
    {
        return super.getMessage();
    }
}

import customExceptions.MyException;

public class UseCustomException {

    MyException newExc=new MyException("This is a custom exception");

    public UseCustomException() throws MyException
    {
        System.out.println("Hello Back Again with custom exception");
        throw newExc;       
}

    public static void main(String args[])
    {
        try
        {
            UseCustomException use=new UseCustomException();
        }
        catch(MyException myEx)
        {
            System.out.println("This is my custom exception:" + myEx.getMessage());
        }
    }
}

이것이 무엇을 반환할까요?
user1876508

UseCusomException의 생성자에서 나오는 "Hello Back Again with custom exception"을 출력하면 메인에서 예외가 발생하고 "This is my custom exception : This is custom custom 예외"가 출력됩니다.
ThePerson

2

예외 클래스에는 두 개의 생성자가 있습니다

  • public Exception() -추가 정보없이 예외를 생성합니다. 예외의 성격은 일반적으로 클래스 이름에서 유추됩니다.
  • public Exception(String s) -지정된 오류 메시지로 예외를 구성합니다. 세부 메시지는이 특정 예외에 대한 오류 조건을 설명하는 문자열입니다.

3
실제로 Java 1.4부터 두 개의 생성자가 더 있습니다 : public Exception(Throwable)public Exception(String, Throwable). 예외 체인 을 올바르게 지원해야합니다 .
Danilo Piazzalunga

@DaniloPiazzalunga가 동의합니다. 출처 : 생성자 요약 docs.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html
KNU

0

Exception에서 상속하면 String을 매개 변수로 사용하는 생성자를 제공해야합니다 (오류 메시지가 포함됨).


나는 또한 당신이 이유를 추가해야한다고 생각합니다.
Jigar Joshi

3
실제로, 그것은 맞지 않습니다. 코드 에서 하나의 String 인수가있는 생성자를 사용 하는 경우 선언해야합니다. 그러나 Exception 서브 클래스 명시적인 생성자가없는 것으로 정의 될 있습니다. Exception에는 인수가없는 생성자가 있기 때문입니다.
Stephen C

0

예외를 던지는 가장 쉬운 방법을 잊지 마십시오 (클래스를 만들 필요는 없습니다)

if (rgb > MAX) throw new RuntimeException("max color exceeded");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.