2011-01-25 8 views
2

NoClasDefFoundErrorがスローされている問題があります。私はインターフェイスを使用しているので、私は困惑し、クラス定義は利用できません。クラスパスを指すいくつかの記事を読んだことがありますが、ここで問題になるとは思いません(間違っているかもしれませんが)。私はNetBeans 6.9.1 IDEを使用しています。NoClassDefFoundError

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

実行時に消費者はSomeObject実装が欠落していることに同意しますが、それはインタフェースを受け入れているため認識してはいけません。

Exception in thread "main" 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(); }} 
+0

感謝を宣言する必要があります!結局のところクラスパスの問題だった。私は、「ロケータ」にクラスパスがあるにもかかわらず、消費者が「オブジェクト」を見る必要があることを認識していませんでした。 –

答えて

6

NoClassDefFoundError例外は、クラスと同じようにインターフェイスで取得できます。 Javaクラスではなく、クラスまたはインタフェースをコンパイルして生成された.classファイルであることを、例外の名前の "Class"と見なします。

これは、class/interface objects.SomeObjectがクラスパス上に表示されないことを示しています。その.classファイルの場所を確認し、クラスパス上にあることを確認してください。もしそれが肯定的であれば、スクリーンショットや問題をデバッグするのに役立つ何かを教えてください。

3

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

パッケージ化/クラスパスの問題があり、実行時環境がビルド時の状態を反映しない場合にのみこれが起こります。

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

+0

これは私の問題でした。参照の参照はクラスパスにはありませんでした。 – boettger1

0

locateImplementation()メソッドでは、 "new SomeObject()"が返されます。 JVMは呼び出されたときにその定義を持つ必要があります。私はそれが欠けていると思う。

0

ので、あなたのSomeObjectのクラスがクラスパスにある場合は、チェックする必要があります - JVMは以下のコードを実行されます

まあ -

ISomeInterface object = Locator.LocateImplementation(); 

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

のでご理解

It puzzles me since I am using interfaces, and no class definition should be available.

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

1

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

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

0

任意のインターフェイスは、クラス内のすべての偉大な答えを

public class Calbacks { 
    public interface IBaseFragmentInterface { 
     void NotifyMainActivity(); 
    } 
}