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スーパークラスに、このクラスにアクセスできるデフォルトのコンストラクター(保護またはパッケージ保護されている可能性があります)がない限り、最後の部分は不可能です。それ以外の場合は、親コンストラクターの1つを明示的に呼び出す必要があります。そうしないと、コンパイルが失敗します。
ショーンパトリックフロイド

43
MyException(Throwable)およびMyException(String, Throwable)コンストラクタを追加して、例外の連鎖を適切にサポートしてください。
Danilo Piazzalunga 2013

8
ほぼ3年後、追加のコンストラクターは追加されていません。:(
byxor

2
@BrandonIbbotson 'they'とはどういう意味で、どこに追加されますか?「they」がスーパークラスのコンストラクタであり、「where」がサブクラスである場合は、誤りです。スーパークラスコンストラクターは、サブクラスに暗黙的に追加されません。さらに、これらの単語が参照するために、前の文で他の主題を見ることができません。
ハリル、2016年

90

私が定義する典型的なカスタム例外は次のようなものです:

public class CustomException extends Exception {

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

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

}

私はEclipseを使用してテンプレートを作成するので、すべてのものを何度も書く必要はありません。


17
Eclipseでクラスを作成するときにExceptionを拡張するだけで、4つのコンストラクターをすべて取得できます。テンプレートは必要ありません。
jeremyjjbrown 2014年

最初のコンストラクタの代わりに2番目のコンストラクタを使用する必要があるのはいつですか?
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()デフォルトのコンストラクターを呼び出さないことに関する以下の質問への回答として、Oracleは次のように述べています

注:コンストラクターがスーパークラスコンストラクターを明示的に呼び出さない場合、Javaコンパイラーはスーパークラスの引数なしコンストラクターへの呼び出しを自動的に挿入します。


1
デフォルトのコンストラクターを呼び出す必要がないのはなぜsuper()ですか?
2014年


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 2013

これは、UseCusomExceptionのコンストラクターからの「Hello Back Again with custom exception」を出力するだけで、例外がスローされてメインでキャッチされ、「This is my custom exception:This is a custom exception」と出力されます。
ThePerson 14

2

例外クラスには2つのコンストラクターがあります

  • public Exception() -これは、追加情報なしで例外を構築します。例外の性質は通常、クラス名から推測されます。
  • public Exception(String s) -指定されたエラーメッセージを使用して例外を作成します。詳細メッセージは、この特定の例外のエラー状態を説明する文字列です。

3
実際、Java 1.4以降では、さらに2つのコンストラクタがpublic Exception(Throwable)ありpublic Exception(String, Throwable)ます。これらは、例外の連鎖を適切にサポートするために必要です。
Danilo Piazzalunga 2013

@DaniloPiazzalungaはあなたに同意します。ソース:コンストラクタの概要 docs.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html
KNU

0

Exceptionから継承する場合は、Stringをパラメーターとして受け取るコンストラクターを提供する必要があります(エラーメッセージが含まれます)。


理由も付け加えればいいと思います。
Jigar Joshi、2009

3
実際には、それは正しくありません。コードで1つの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.