Javaでカスタム例外を作成する方法は?[閉まっている]


149

Javaでカスタム例外を作成するにはどうすればよいですか?


2
これは、ほとんどのOO言語で使用されている方法論と同じです。つまり、基本のExceptionクラスを拡張します。
NDM


1)//使用定義の例外クラスMyExceptionを表すクラスMyException extends Exception {public MyException(String s){super(s); }} ------------------------------------------------ 2)try {//ユーザー定義の例外のオブジェクトをスローしますthrow new MyException( "TestException"); } catch(MyException ex){System.out.println( "Caught"); // MyExceptionオブジェクトからメッセージを出力しますSystem.out.println(ex.getMessage()); }
Mandeep Yadav

回答:


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.Exceptionjava.lang.ErrorはどちらものサブクラスですThrowable。サブクラスThrowableがスローまたはキャッチされる可能性のあるもの。ただし、これは通常Error、プログラマ(たとえばOutOfMemoryError)が「処理」できないJVM内部のエラーを示すために使用されるため、通常はキャッチまたはスローすることは悪い習慣です。同様にThrowable、をキャッチすることは避けてください。これにより、Errorに加えてもキャッチされる可能性があります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クラスの拡張であるため、他の一般的なタイプのスロー可能オブジェクトとは異なり、チェックされた例外(RuntimeExceptionまたはそれに基づくクラスはチェックされません)です。Errors通常は、JVM内部を超えて適切に処理されるように設計されたものではありません。

例外を非公開にすることもできますが、パッケージ全体ではなく、例外を定義するパッケージでのみ例外を使用できます。

カスタム例外のスロー/キャッチに関しては、組み込みの例外と同じように機能します。

throw new MyCustomException()

そして経由でキャッチ

catch (MyCustomException e) { }

4
RuntimeExceptionはExceptionを拡張したものであり、チェック済みの例外ではありません。
アダムスキー

2
技術的には、拡張Throwableするものはすべてスローできます。例外は延長しExceptionます。Throwableのカスタムサブクラスは、try { ... } catch (Exception e) { ... }ブロックによってキャッチされません。
Andrzej Doyle

なぜ人々はこの答えを支持していますか?いくつかの不正確さが含まれています。1)インターフェースなので、スローインプリメントはできません。2)Throwable を拡張するものは例外ではありません(例外でErrorはなく、エラーです)。3)これは、Exceptionのサブクラスがチェックされるのに対し、RuntimeExceptionはチェックされないことを意味します。Adamskiの答えははるかに正確です。
oxbow_lakes 2009年

おっと- もちろん、throwableはインターフェイスではありません
oxbow_lakes 2009年

@oxbow_lakes-理想的な解決策は、不正確さを修正することでしょう。とにかく、誰もしなかったので、自分で修正しました。
アンバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.