web-dev-qa-db-ja.com

Java / Androidでカスタム例外をスローする

カスタム例外クラスを開発しています。このクラスには、次のコンストラクタがあります。

_public class UserException extends Exception
{
    string message;
    public UserException() {
        super();
    }

    public UserException(String message, Throwable cause)
    {
        super(message, cause);

        this.cause = cause;
        this.message = message;
    }
}
_

そして、私はこのような新しいカスタム例外を作成します:

_private Camera.PreviewCallback SetPreviewCallBack() throws UserException {
    .......
    // Something went wrong
    throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed)));
 }
_

しかし、throw new UserException(...)を挿入すると、_try/catch_で囲むように指示されます。それは考えではありませんか? _new Exceptions_句を追加して_try/catch_を無効にすることなく、例外をスローする必要があるときにカスタム例外をスローしたい。

だから、私は何を間違っているのですか?私は何を誤解していますか?

15
Sonhja

Eranの回答に加えて、カスタム例外をキャッチする必要のないRuntimeExceptionに拡張することもできます。

19
DennisW

この例外をスローするメソッドがそれを処理しない(つまり、キャッチしない)場合、これはthrows句で宣言する必要があります。これは、チェックされた例外であるためです。

public void yourMethod () throws UserException
{
    ...
    throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed)));
    ...
}
9
Eran

カスタム例外が Exception クラスから拡張される場合は、それを処理するか(try-catchを使用)、または呼び出し元に渡す必要があります(throwsを使用)。例外を処理するためにランタイムに残したい場合は、 RuntimeException Classから拡張する必要があります。シナリオの最初のケースなので、次のようにする必要があります。

public void surroundingMethod() throws UserException{
    throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed)));
}

これは基本的に例外を呼び出し元に渡すので、try-catchで処理するか、もう一度渡すのは呼び出し元の責任になります。

もう一度、呼び出し命令を次のように変更する必要があります

public void callingMethod () {
    try {
        surroundingMethod();
    } catch (UserException ex){
    }
}
6
Ankit

メソッドをthrows UserExceptionとして宣言するか、例外を拡張してください RuntimeException

後者は公式には推奨されていませんが、 Javaの宣言された例外メカニズム をバイパスするためによく使用されます。

3
amit

Javaでは、throw acheckedExceptionを実行すると、次のことを実行する必要があります。

1。throwの周りにtry-catchブロックを追加して、同じメソッド内でこのExceptionを処理します。

2。または、throwsステートメントをメソッド定義に追加して、Exceptionの処理の責任をより高いレベルのメソッドに移します。

これは、モジュール化と抽象化の全体的なOOPパラダイムの一部です:Exception、メソッドの呼び出し元、またはメソッド自体の処理を担当するのは誰か?答えは、 Exceptionの性質。

2
Y.S