1. 概要

この記事では、 NoSuchFieldError の背後にある理由を示し、それを解決する方法を発見します。

2. NoSuchFieldError

名前が示すように、 NoSuchFieldError は、指定されたフィールドが存在しない場合に発生します。 NoSuchFieldError は、 IncompatibleClassChangeError クラスを拡張し、アプリケーションがオブジェクトのフィールドまたはクラスの静的フィールドにアクセスまたは変更しようとしたが、オブジェクトまたはクラスがもはや存在しない場合にスローされますそのフィールドがあります。

IncompatibleClassChangeError クラスは、 LinkageError クラスを拡張し、互換性のないクラス定義の変更を実行したときに発生します。 最後に、LinkageErrorErrorを拡張し、クラスが互換性のない別の変更されたクラスに依存していることを示します。

例を使用して、このエラーの動作を見てみましょう。 最初のステップとして、依存関係クラスを作成しましょう。

public class Dependency {
    public static String message = "Hello Baeldung!!";
}

次に、Dependencyクラスのフィールドを参照するFieldErrorExampleクラスを作成します。

public class FieldErrorExample {
    public static String getDependentMessage() {
        return Dependency.message;
    }
}

また、Dependencyクラスからmessageを取得しているかどうかを確認するコードを追加しましょう。

public static void fetchAndPrint() {
    System.out.println(getDependentMessage());
}

これで、 javac コマンドを使用してこれらのファイルをコンパイルでき、FieldErrorExampleクラスをjavaコマンドを使用して実行すると、指定されたが出力されます。メッセージ

ただし、 Dependencyクラスの属性名をコメント化、削除、または変更して再コンパイルすると、エラーが発生します。

たとえば、Dependencyクラスの属性名を変更してみましょう。

public class Dependency {
    public static String msg = "Hello Baeldung!!";
}

ここで、 Dependency クラスのみを再コンパイルしてから、 FieldErrorExample を再度実行すると、NoSuchFieldErrorが発生します。

Exception in thread "main" java.lang.NoSuchFieldError: message

上記のエラーは、FieldErrorExampleクラスがDependencyクラスの静的フィールドmessage を参照しているために発生しましたが、存在しなくなりました。互換性がなくなりました。 Dependencyクラスに変更します。

3. エラーの解決

このエラーを回避するには、既存のファイルをクリーンアップしてコンパイルする必要があります。 これは、 javacコマンドを使用するか、Mavenでmvn clean installを実行することで実行できます。この手順を実行すると、最新のコンパイル済みファイルがすべて取得され、エラーが発生しなくなります。

エラーが続く場合は、複数のJARファイルが問題である可能性があります。1つはコンパイル中、もう1つは実行中です。 これは、アプリケーションが外部JARに依存している場合によく発生します。 ここでは、ビルドパス内のJARの順序を検証して、一貫性のないJARを特定する必要があります。

さらに調査する必要がある場合は、-verbose:クラスオプションを使用してアプリケーションを実行し、ロードされたクラスを確認すると便利です。 これは、古いクラスを識別するのに役立ちます。

サードパーティのJARが内部で別のバージョンを参照している場合があり、その結果NoSuchFieldErrorが発生します。 これが発生した場合、私たちは使用することができます mvndependency:tree-Dverbose。 これにより、Maven依存関係ツリーが生成されます一貫性のないJARを特定するのに役立ちます。

4. 結論

この短いチュートリアルでは、 NoSuchFieldError が発生する理由を示し、それを解決する方法を確認しました。

いつものように、コードはGitHubから入手できます。