web-dev-qa-db-ja.com

Javaでカスタム例外タイプを作成する方法

可能な重複:
自分で例外を作成するにはどうすればよいですか?

Javaでカスタム例外を作成したいのですが、どうすればよいですか。

...

try{

...

String Word=reader.readLine();

if(Word.contains(" "))
  /*create custom exception*/

}
catch(){

throw new...を使用してカスタム例外を作成すると、エラーunreported exception...must be caught or declared to be thrownが発生します。

155
Mazzy

次のように、 Exception クラスを拡張するカスタム例外クラスを作成できます。

class WordContainsException extends Exception
{
      // Parameterless Constructor
      public WordContainsException() {}

      // Constructor that accepts a message
      public WordContainsException(String message)
      {
         super(message);
      }
 }

使用法:

try
{
     if(Word.contains(" "))
     {
          throw new WordContainsException();
     }
}
catch(WordContainsException ex)
{
      // Process message however you would like
}
225
Rion Williams

Exceptionから拡張するクラスを作成する必要があります。これは次のようになります。

public class MyOwnException extends Exception {
    public MyOwnException () {

    }

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

    public MyOwnException (Throwable cause) {
        super (cause);
    }

    public MyOwnException (String message, Throwable cause) {
        super (message, cause);
    }
}

あなたの質問は、この新しい例外がチェックされるべきかチェックされないべきかを特定していません。

ご覧のとおり ここ には、2つのタイプが異なります。

  • チェック付き例外は、メソッドを呼び出す開発者が対処すべき問題のある状況にフラグを立てるためのものです。そのような例外から回復することは可能であるはずです。この良い例は FileNotFoundException です。これらの例外は Exception のサブクラスです。

  • 未チェックの例外は、コード内のバグ、つまり回復できない可能性があるという予期しない状況を表すことを目的としています。 A NullPointerException は古典的な例です。これらの例外は RuntimeException のサブクラスです。

チェックされた例外は、それをキャッチしてそれに応じて動作することによって、あるいはそれを呼び出しメソッドにスローすることによって、呼び出しメソッドによって処理される必要があります。未チェックの例外は、それが可能であってもキャッチされることを意味していません。

113
Laf

カスタム例外クラスを作成することに関する素晴らしい回答。あなたが問題の例外を再利用するつもりなら、私は彼らの答え/アドバイスに従うでしょう。ただし、メッセージとともにスローされるクイック例外だけが必要な場合は、その場で基本例外クラスを使用できます。

String Word=reader.readLine();

if(Word.contains(" "))
  /*create custom exeception*/
  throw new Exception("My one time exception with some message!");
}
16
Feisty Mango

あなただけの例外を作成してスローすることができるのでそれは同じくらい簡単かもしれません

if ( Word.contains(" ") )
{
     throw new RuntimeException ( "Word contains one or more spaces" ) ;
}

もっと正式になりたいのであれば、Exceptionクラスを作成することができます。

class SpaceyWordException extends RuntimeException
{

}

いずれにせよ、あなたがRuntimeExceptionを使う場合、あなたの新しいExceptionはチェックされないでしょう。

12
emory

慎重なプログラマーは特別な出来事のためにしばしば例外を投げるので、IllegalArgumentExceptionIllegalStateExceptionUnsupportedOperationExceptionのようないくつかの一般目的の例外を言及する価値があります。 IllegalArgumentExceptionが私のお気に入りです。

throw new IllegalArgumentException("Word contains blank: " + Word);
10
Joop Eggen

例外は、 Exception から拡張されることを除いて、他のクラスと同じクラスです。あなたがあなた自身のクラスを作成するのであれば

public class MyCustomException extends Exception

あなたはそのようなインスタンスを投げることができます

   throw new MyCustomException( ... );
   //using whatever constructor params you decide to use

そして これ はおもしろいでしょう

5
Robin

Exception(チェック例外の場合)、またはExceptionのサブクラス、またはRuntimeException(ランタイム例外の場合)、またはRuntimeExceptionのサブクラスを拡張するクラスを作成するだけです。

それで、あなたのコードでは、単に使用してください

if (Word.contains(" "))
    throw new MyException("some message");
}

Javaチュートリアルを読んでください。これは、すべてのJava開発者が知っておくべき基本事項です。 http://docs.Oracle.com/javase/tutorial/essential/exceptions/

3
JB Nizet

あなたは他の場所であなたの例外を新しいクラスとして定義しなければなりません

public class YourCustomException extends Exception{

//Required inherited methods here
}

それからYourCustomExceptionをスローしてキャッチすることができます。

2
Thomas

Java.lang.Exceptionから継承することで、独自の例外を作成できます。ここで は、そうするのに役立つ例です。

2
GETah