カスタム例外クラスを開発しています。このクラスには、次のコンストラクタがあります。
_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
_を無効にすることなく、例外をスローする必要があるときにカスタム例外をスローしたい。
だから、私は何を間違っているのですか?私は何を誤解していますか?
Eranの回答に加えて、カスタム例外をキャッチする必要のないRuntimeException
に拡張することもできます。
この例外をスローするメソッドがそれを処理しない(つまり、キャッチしない)場合、これはthrows
句で宣言する必要があります。これは、チェックされた例外であるためです。
public void yourMethod () throws UserException
{
...
throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed)));
...
}
カスタム例外が 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){
}
}
メソッドをthrows UserException
として宣言するか、例外を拡張してください RuntimeException
。
後者は公式には推奨されていませんが、 Javaの宣言された例外メカニズム をバイパスするためによく使用されます。
Javaでは、throw
acheckedException
を実行すると、次のことを実行する必要があります。
1。throw
の周りにtry-catch
ブロックを追加して、同じメソッド内でこのException
を処理します。
2。または、throws
ステートメントをメソッド定義に追加して、Exception
の処理の責任をより高いレベルのメソッドに移します。
これは、モジュール化と抽象化の全体的なOOPパラダイムの一部です:Exception
、メソッドの呼び出し元、またはメソッド自体の処理を担当するのは誰か?答えは、 Exception
の性質。