私は自分自身の例外クラスを最も簡単な方法で定義しようとしています、そしてこれは私が得ているものです:
public class MyException extends Exception {}
public class Foo {
public bar() throws MyException {
throw new MyException("try again please");
}
}
これはJavaコンパイラが言うことです:
cannot find symbol: constructor MyException(Java.lang.String)
このコンストラクタは Java.lang.Exception
から継承する必要があると感じましたね。
いいえ、デフォルト以外のコンストラクタを「継承」するのではなく、クラス内でStringを取るものを定義する必要があります。通常、コンストラクタでsuper(message)
を使用して親コンストラクタを呼び出します。たとえば、次のようになります。
public class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
私が定義する典型的なカスタム例外はこのようなものです:
public class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
public CustomException(String message, Throwable throwable) {
super(message, throwable);
}
}
私はEclipseを使ってテンプレートを作成することさえするので、私はすべてのものを何度も書く必要はありません。
Eclipseで新しいクラスダイアログを使用する場合は、SuperclassフィールドをJava.lang.Exception
に設定し、「スーパークラスからのコンストラクタ」をチェックするだけで、次のように生成されます。
package com.example.exception;
public class MyException extends Exception {
public MyException() {
// TODO Auto-generated constructor stub
}
public MyException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
public MyException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
}
public MyException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
}
}
デフォルトのコンストラクタでsuper()
を呼び出さないことについての以下の質問に答えて、Oracleは これを言うために :
注: コンストラクターがスーパークラスのコンストラクターを明示的に呼び出さない場合、Javaコンパイラーはスーパークラスの引数のないコンストラクターへの呼び出しを自動的に挿入します。
この理由は、Javaプラットフォームの Inheritance の記事で説明されています。
"サブクラスは、そのスーパークラスからすべてのメンバ(フィールド、メソッド、およびネストクラス)を継承します。コンストラクタはメンバではありませんしたがって、サブクラスによって継承されることはありませんが、スーパークラスのコンストラクタはサブクラス」
package customExceptions;
public class MyException extends Exception{
public MyException(String exc)
{
super(exc);
}
public String getMessage()
{
return super.getMessage();
}
}
import customExceptions.MyException;
public class UseCustomException {
MyException newExc=new MyException("This is a custom exception");
public UseCustomException() throws MyException
{
System.out.println("Hello Back Again with custom exception");
throw newExc;
}
public static void main(String args[])
{
try
{
UseCustomException use=new UseCustomException();
}
catch(MyException myEx)
{
System.out.println("This is my custom exception:" + myEx.getMessage());
}
}
}
例外クラスには2つのコンストラクタがあります
public Exception()
- これは追加情報なしでExceptionを構築します。例外の性質は通常クラス名から推測されます。public Exception(String s)
- 指定されたエラーメッセージを持つ例外を構築します。詳細メッセージは、この特定の例外のエラー状態を説明するStringです。Exceptionを継承する場合は、Stringをパラメータとして取るコンストラクタを提供する必要があります(エラーメッセージが含まれます)。