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

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

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이 들지 않습니까?



답변

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

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


답변

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

public class CustomException extends Exception {

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

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

}

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


답변

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 컴파일러는 수퍼 클래스의 인수가없는 생성자에 대한 호출을 자동으로 삽입합니다.


답변

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

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


답변

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());
        }
    }
}


답변

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

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

답변

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