2011-01-25 109 views
2

我有一個NoClasDefFoundError被拋出的問題。它使我感到困惑,因爲我使用接口,並且沒有類定義應該可用。我已閱讀了一些指向Classpath的帖子,但我不認爲這是問題(儘管我可能是錯的)。我正在使用NetBeans 6.9.1 IDE。NoClassDefFoundError

我已經創建了一個示例設置來重現此問題。四個項目:接口,對象,定位器和消費者。下面你會找到實現。

在運行時消費者關於丟失SomeObject實現的coplains,由於它接受接口,所以它不應該知道。

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

感謝所有爲偉大的答案!畢竟這是一個類路徑問題。我不知道消費者也需要看到「對象」,儘管「定位器」將它們放在了類路徑中。 – 2011-01-25 18:20:27

回答

6

您可以像使用類一樣獲得接口的NoClassDefFoundError異常。考慮將異常名稱中的「Class」作爲編譯類或接口而不是Java類時生成的.class文件。

這就是說類/接口objects.SomeObject在類路徑中不可見。檢查該.class文件的位置並確保它位於你的類路徑中 - 如果你確信它在那裏,請給我們一些屏幕截圖或可能有助於調試問題的內容。

3

將NoClassDefFoundError視爲運行時鏈接問題。 JRE加載了一個類(或一個接口),並引用了另一個類(或一個接口),但未找到該引用的類。

如果您有打包/類路徑問題,以致您的運行時環境無法反映構建時的情況,則可能發生這種情況。

如果您是從IDE啓動此功能,請確保您不會忽略任何錯誤並啓動。有些類不會以這種方式生成。

+0

這是我的問題:引用的引用不在我的類路徑中。 – boettger1 2012-04-30 04:35:11

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

通常我會遇到這些問題,而不是當一個類丟失,但是當靜態初始值設定項有錯誤時。

嘗試在調試器中運行代碼,並設置異常斷點,以便在引發任何異常時中斷,無論是否被捕獲。我敢打賭,出於某種原因,你在靜態初始化器中有一個未捕獲的異常。

0

任何接口必須內部類被聲明

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