Javaでカスタム例外を作成する
1前書き
このチュートリアルでは、Javaでカスタム例外を作成する方法について説明します。
ユーザー定義の例外がチェック済みおよび未チェックの両方の例外に対してどのように実装され使用されるかを示します。
2カスタム例外の必要性
Java例外は、プログラミングで起こることになっているほとんどすべての一般的な例外をカバーします。
ただし、これらの標準的な例外を独自のもので補足する必要がある場合があります。
カスタム例外を導入する主な理由は次のとおりです。
-
ビジネスロジックの例外 – に固有の例外
ビジネスロジックとワークフローこれらはアプリケーションのユーザーや
開発者は、正確な問題が何であるかを理解しています
** 既存のJavaのサブセットを特定して処理する
例外
Java例外はチェックしたりチェックを外したりすることができます。次のセクションでは、これら両方のケースについて説明します。
3カスタムチェック例外
チェック例外は、明示的に扱う必要がある例外です。
ファイルの最初の行を返すコードを考えてみましょう。
try (Scanner file = new Scanner(new File(fileName))) {
if (file.hasNextLine()) return file.nextLine();
} catch(FileNotFoundException e) {
//Logging, etc
}
上記のコードは、Javaチェック例外を処理するための古典的な方法です。
コードは
FileNotFoundExceptionをスローしますが、
正確な原因が何であるかが明確になっていません – ファイルが存在しないかファイル名が無効か。
-
カスタム例外を作成するには、
java.lang.Exception
クラスを拡張する必要があります。
IncorrectFileNameExceptionというカスタムチェック例外を作成して、この例を見てみましょう:
public class IncorrectFileNameException extends Exception {
public IncorrectFileNameException(String errorMessage) {
super(errorMessage);
}
}
エラーメッセージとして
String
を取り、親クラスコンストラクタと呼ばれるコンストラクタも提供する必要があることに注意してください。
これがカスタム例外を定義するために必要なことのすべてです。
次に、この例でカスタム例外を使用する方法を見てみましょう。
try (Scanner file = new Scanner(new File(fileName))) {
if (file.hasNextLine())
return file.nextLine();
} catch (FileNotFoundException e) {
if (!isCorrectFileName(fileName)) {
throw new IncorrectFileNameException("Incorrect filename : " + fileName );
}
//...
}
カスタム例外を作成して使用したので、ユーザーは正確な例外が何かを知ることができます。これで十分ですか?その結果、
例外の根本的な原因を失います
。
これを修正するために、
java.lang.Throwable
パラメータをコンストラクタに追加することもできます。これにより、ルート例外をメソッド呼び出しに渡すことができます。
public IncorrectFileNameException(String errorMessage, Throwable err) {
super(errorMessage, err);
}
さて、
IncorrectFileNameException
は、このような例外の根本的な原因と共に使用されます。
try (Scanner file = new Scanner(new File(fileName))) {
if (file.hasNextLine()) {
return file.nextLine();
}
} catch (FileNotFoundException err) {
if (!isCorrectFileName(fileName)) {
throw new IncorrectFileNameException(
"Incorrect filename : " + fileName , err);
}
//...
}
これにより、発生した根本的な原因を失うことなく、カスタム例外を使用できます。
4未チェックのカスタム例外
同じ例で、ファイル名に拡張子が含まれていない場合は、カスタム例外が必要であるとします。
この場合、このエラーは実行時にのみ検出されるため、前のものと同様のカスタムの未チェック例外が必要です。
-
カスタムの未チェック例外を作成するには、
java.lang.RuntimeException
クラスを拡張する必要があります。
public class IncorrectFileExtensionException
extends RuntimeException {
public IncorrectFileExtensionException(String errorMessage, Throwable err) {
super(errorMessage, err);
}
}
したがって、このカスタムの未チェック例外を例で使用できます。
try (Scanner file = new Scanner(new File(fileName))) {
if (file.hasNextLine()) {
return file.nextLine();
} else {
throw new IllegalArgumentException("Non readable file");
}
} catch (FileNotFoundException err) {
if (!isCorrectFileName(fileName)) {
throw new IncorrectFileNameException(
"Incorrect filename : " + fileName , err);
}
//...
} catch(IllegalArgumentException err) {
if(!containsExtension(fileName)) {
throw new IncorrectFileExtensionException(
"Filename does not contain extension : " + fileName, err);
}
//...
}
5結論
ビジネスロジックに関連する特定の例外を処理する必要がある場合は、カスタム例外が非常に役立ちます。適切に使用されれば、それらはより良い例外処理とロギングのための有用なツールとして役立ちます。
この記事で使われている例のコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-lang[over on Github]にあります。