2015-02-07 103 views
-2

我編譯成功了我的程序,但在運行它時遇到了未定義的類錯誤。奇怪的是我沒有在myprogram中使用cern/colt/matrix/DoubleMatrix1D類(我用「grep」驗證了這一點)。有人可以請指點我正確的方向嗎?由於爲什麼java會抱怨一個沒有使用的類?

$ javac -cp $(find ../resources/ -name "*.jar"|tr "\n" ":") myprogram.java 
Note: Some input files use unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 

$ java myprogram 
Exception in thread "main" java.lang.NoClassDefFoundError: cern/colt/matrix/DoubleMatrix1D 
     at java.lang.Class.getDeclaredMethods0(Native Method) 
     at java.lang.Class.privateGetDeclaredMethods(Class.java:2615) 
     at java.lang.Class.getMethod0(Class.java:2856) 
     at java.lang.Class.getMethod(Class.java:1668) 
     at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) 
     at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486) 
Caused by: java.lang.ClassNotFoundException: cern.colt.matrix.DoubleMatrix1D 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
     ... 6 more 

注:

  1. DoubleMatrix1D是一個抽象類。
  2. 我在myprogram中使用了DoubleMatrix1D的子類'SparseDoubleMatrix1D'。
+1

很明顯你會在你的程序中使用它。請注意,當您編譯程序時(編譯器知道它們),您會在類路徑中添加一堆jar文件,但在運行程序時不會。 – immibis 2015-02-07 23:26:29

回答

0

您不能在程序的源代碼中直接/明確地使用該類。但你絕對間接使用它...。

例如:

  • 這可能是你直接使用一些類的內部字段的類型。

  • 它可能是您直接使用某個類的超類。

  • 和一些其他的東西......


無論如何,底線是,你的代碼將不會運行除非你把JAR(或其他)包含丟失類到運行時類路徑上。

由於缺少的類是超類,JRE需要它,因爲它在創建子類的實例時需要超類構造函數的代碼。

+0

非常感謝。這工作! – cody 2015-02-07 23:38:48

相關問題