1

NoClasDefFoundErrorがスローされるという問題があります。私はインターフェースを使用しているので、それは私を困惑させます、そしてクラス定義は利用可能であるべきではありません。クラスパスを指すいくつかの投稿を読みましたが、ここで問題になるとは思いません(間違っているかもしれませんが)。NetBeans6.9.1IDEを使用しています。

問題を再現するためのサンプルセットアップを作成しました。4つのプロジェクト:インターフェース、オブジェクト、ロケーター、コンシューマー。以下に実装を示します。

実行時に、コンシューマーは、SomeObjectの実装が欠落していることについて不平を言います。これは、インターフェイスを受け入れているため、認識してはなりません。

スレッド「メイン」の例外java.lang.NoClassDefFoundError:objects / SomeObject

私は何が欠けていますか?

package interfaces;
public interface ISomeInterface { }

package objects;
import interfaces.ISomeInterface;
public class SomeObject implements ISomeInterface{ }

package locator;
import interfaces.ISomeInterface;
import objects.SomeObject;
public class Locator { public static ISomeInterface LocateImplementation() { return new SomeObject(); }}

package consumer;
import interfaces.ISomeInterface;
import locator.Locator;
public class Main { public static void main(String[] args) { ISomeInterface object = Locator.LocateImplementation(); }}
4

6 に答える 6

6

クラスの場合と同じように、インターフェイスでもNoClassDefFoundError例外が発生する可能性があります。例外の名前の「クラス」は、Javaクラスではなく、クラスまたはインターフェースのコンパイルから生成された.classファイルであると考えてください。

これは、クラス/インターフェースobjects.SomeObjectがクラスパスに表示されていないことを意味します。その.classファイルの場所を確認し、それがクラスパス上にあることを確認します。そこにあることが確実な場合は、問題のデバッグに役立つ可能性のあるスクリーンショットなどを提供してください。

于 2011-01-25T17:31:25.223 に答える
3

NoClassDefFoundErrorは、ランタイムリンケージの問題と考えてください。JREは1つのクラス(またはインターフェース)をロードし、別のクラス(またはインターフェース)を参照していますが、その参照クラスが見つかりません。

これが発生する唯一の方法は、ランタイム環境がビルド時の状態を反映しないようなパッケージング/クラスパスの問題がある場合です。

これをIDEから起動する場合は、エラーを無視して起動しないようにしてください。一部のクラスはそのように生成されません。

于 2011-01-25T17:31:33.597 に答える
1

通常、これらの問題が発生するのは、クラスが欠落しているときではなく、静的初期化子にエラーがあるときです。

デバッガーでコードを実行してみて、キャッチされたかどうかに関係なく、例外がスローされたときにブレークするように例外ブレークポイントを設定します。何らかの理由で静的初期化子にキャッチされない例外があるに違いありません。

于 2011-01-25T17:50:59.110 に答える
0

「newSomeObject()」を返すlocateImplementation()メソッドでは、JVMが呼び出されたときにその定義を持っている必要があります。足りないと思います。

于 2011-01-25T17:33:54.020 に答える
0

SomeObjectクラスがクラスパスにあるかどうかを確認する必要があります。理由は-

さて、JVMは以下のコードを実行します-

ISomeInterface object = Locator.LocateImplementation();

その場合、Locator.LocateImplementation()が呼び出されます。このコードは、クラスパスに見つからないSomeObjectクラスを内部的にインスタンス化しようとします。

だからあなたの以下の理解

私はインターフェースを使用しているので、それは私を困惑させます、そしてクラス定義は利用可能であるべきではありません。

本当に有効ではありません。

于 2011-01-25T17:34:46.407 に答える
0

すべてのインターフェイスはクラス内で宣言する必要があります

public class Calbacks {
    public interface IBaseFragmentInterface {
        void NotifyMainActivity();
    }
}
于 2017-04-02T19:10:23.040 に答える