HOWTO · Java

Java java.lang.AbstractMethodError

この記事は、識別子の予期されるエラーと、それらを Java で解決する方法を理解するのに役立ちます。

このページの内容

この記事は、java.lang.AbstractMethodError と Java でそれらを解決する方法を理解するのに役立ちます。

Java の java.lang.AbstractMethodError エラーを修正する

実行時にプログラムで AbstractMethodError が発生することがあります。 この間違いに慣れていないと、問題の原因を突き止めるのに時間がかかることがあります。

このレッスンでは、AbstractMethodError をさらに詳しく調べます。 AbstractMethodError とは何か、いつ発生する可能性があるかを学びます。

プログラムが実装されていない抽象メソッドを作成しようとすると、エラー AbstractMethodError が発生します。 抽象プロセスが実装されていない場合、コンパイラがエラーを発生させることはわかっています。 その結果、アプリケーションは作成されません。

コマンドライン javac コンパイラを使用して AbstractMethodError の例を作成します。 このエラーは、クラスが個別にコンパイルされたときに生成されますが、これはほとんどの IDE で禁止されています。

以下のソースコードから Abstract という名前の Java クラスを作成します。

コード (Abstract.java):

public class Abstract {
  public void hello() {
    System.out.println("Hello! I belong to abstract class");
  }
}

このクラスをコンパイルするには、コマンド ラインで次の手順に従います。

javac Abstract.java

最初のクラスがコンパイルされたら、次のソース コードを使用して AbstractClass という名前の 2 番目のクラスを作成します。

コード (AbstractClass.java):

public class AbstractClass extends Abstract {
  public static void main(String[] args) {
    AbstractClass newabs = new AbstractClass();

    newabs.hello();
  }
}

これは、次のようにアセンブルして実行した結果です。

javac AbstractClass.java
java AbstractClass

出力:

Hello! I belong to abstract class

すべて問題ありませんが、hello() 関数を抽象関数に変更し、AbstractClass を変更せずに Abstract を再コンパイルするとどうなるでしょうか? Abstract を次のように変更してみてください。

public abstract class Abstract {
  public abstract void hello();
}

このクラスを簡単に再コンパイルできるようになりました。 ただし、AbstractClass を実行すると、次の結果が得られます。

Exception in thread "main" java.lang.AbstractMethodError: AbstractClass.hello()V
        at AbstractClass.main(AbstractClass.java:6)

基本クラスのメソッドが抽象メソッドに変更され、結果として基本クラスが変更され、必要な変更が子クラスで行われなかったとします。 その場合、AbstractMethodError が発生します (つまり、抽象メソッドをオーバーライドします)。

したがって、上記の例と同様に、プログラマーは実装されていない抽象メソッドを (その抽象性を意識せずに) 使用します。 基本クラスのみが変更されてコンパイルされるため、彼はこの問題に気づいていません。

この状況では、AbstractClassAbstract メソッドを実装することがすべて必要です。 AbstractMethodError の問題は、これを行うことで解決されます。

public class AbstractClass extends Abstract {
  public static void main(String[] args) {
    AbstractClass newabs = new AbstractClass();

    newabs.hello();
  }

  @Override
  public void hello() {
    System.out.println("Hello! I belong to abstract class");
  }
}

出力:

Hello! I belong to abstract class