2011-02-09 37 views
18

Tôi gặp sự cố khi thử thực hiện ứng dụng java của mình. Bất cứ khi nào tôi cố gắng để thực hiện chương trình thông qua lệnhNhận được "tên sai" NoClassDefFoundError khi thực hiện một chương trình Java từ dòng lệnh

java ProgAudioJ 

tôi nhận được lỗi này:

Exception in thread "main" 
java.lang.NoClassDefFoundError: ProgAudioJ (wrong name: es_2011/ProgAudioJ) 
     at java.lang.ClassLoader.defineClass1(NativeMethod) 
     at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:616) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) 
     at java.net.URLClassLoader.access$000(URLClassLoader.java:58) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:197) 
     at java.security.AccessController.doPrivileged(NativeMethod) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
Could not find the main class: ProgAudioJ. Program will exit. 

Nếu tôi loại bỏ từ mã của tôi:

package es_2011; 

Tất cả mọi thứ hoạt động hoàn hảo. Làm thế nào để giải quyết vấn đề?

+0

những gì bạn có nghĩa là 'nếu tôi xóa es_2011 '- xóa khỏi Ở đâu? – akf

+0

Ý tôi là từ mã số .. – MAX

+3

Tôi nghĩ bạn sẽ cần hiển thị mã để minh họa ý của bạn. – DaveJohnston

Trả lời

2

Hãy thử sử dụng:

java es_2011.ProgAudioJ 

(thay vì java ProgAudioJ).

Tôi đang thực hiện một số giả định ở đây về thư mục làm việc hiện tại của bạn và CLASSPATH của bạn. Nếu bạn có thể cung cấp thông tin về lệnh bạn đang chạy (ví dụ: thư mục bạn đang ở, nơi tệp lớp học được đặt, v.v.), chúng tôi có thể giúp bạn hiệu quả hơn.

2

Hãy thử điều này (biên dịch và chạy):

dir

2011-02-10 00:30 <DIR>   . 
2011-02-10 00:30 <DIR>   .. 
2011-02-10 00:27    58 es_2011 

javac es_2011/ProgAudioJ

java es_2011.ProgAudioJ

1

Nó tuyên bố khá rõ ràng ở đó:

java.lang.NoClassDefFoundError: ProgAudioJ (wrong name: es_2011/ProgAudioJ)

Nếu bạn muốn đặt một lớp trong một gói (*), sau đó mã nguồn phải được đặt trong một thư mục tương ứng, ví dụ:

src/Main.java <- root package (no declaration) 
src/es_2011/ProgAudioJ.java <- package es_2011; 

(*) Bạn nên làm điều đó luôn luôn, ngoại trừ những thứ nhỏ nhặt và có thể cho lớp chính.

+0

OMFG hai downvotes: D, tại sao ??? – maaartinus

44

Vì tôi đã tìm thấy những câu trả lời này không rõ ràng, dưới đây là những gì bạn cần làm. Đầu tiên, nếu bạn gói mã của bạn (IE, các lớp của bạn có từ khóa package ở trên cùng) các lớp được biên dịch phải nằm trong một thư mục có cùng tên với khai báo gói của bạn trong mã. Sau khi bạn đã biên soạn các lớp của mình, bạn cần phải di chuyển lên một thư mục khi bạn thực hiện lệnh java và bạn bao gồm tên của gói. Ví dụ, nếu mã của bạn tồn tại trong /myFolder/myPackage/, và lớp học của bạn bắt đầu với package myPackage (lưu ý rằng các thư mục và các gói là cùng tên), sau đó bạn sẽ làm như sau (Linux/OSX):

cd /myFolder/myPackage 

javac MyClass.java 

cd .. 

java myPackage.MyClass 

Sửa - Một bản chỉnh sửa muộn để làm rõ điều gì đó mà tôi thấy mọi người bối rối. Trong ví dụ trên, gói chỉ là một phần sâu, nghĩa là chỉ myPackage của nó.Nếu mã của bạn có gói lớn hơn, chẳng hạn như

package com.somedomain.someproject; 

bạn sẽ cần thực thi lệnh java từ thư mục chứa thư mục gốc cho gói đó. Ví dụ: nếu mã được biên dịch của bạn nằm trong myCode/com/somedomain/someproject/MyMainClass.class, thì bạn sẽ thực hiện lệnh java từ thư mục myCode, như thế này (Một lần nữa, lưu ý đặc biệt cấu trúc thư mục giống như gói khai):

cd /myCode 
java com.somedomain.someproject.MyMainClass 
+3

cảm ơn bạn rất nhiều: DI đã trở nên điên rồ để tìm ra cái quái gì với nó vì không có lỗi biên dịch nào được hiển thị – Dix

+2

câu trả lời hữu ích luôn cho bạn biết tại sao thay vì chỉ cách – David

+0

Cảm ơn bạn và OP nên chọn câu trả lời này – user2418202

0

lý do mà nó hoạt động khi bạn loại bỏ
package es_2011
là bạn đang thay đổi cách các gói biên dịch lên, và nằm một cách hiệu quả, các tập tin.

Tôi gặp sự cố tương tự - và thông báo lỗi wrong name: thực sự chỉ cho bạn câu trả lời. Bạn đang sử dụng sai tên "ProgAudioJ" để chạy tệp .class. Nó đã được đóng gói như

es_2011/ProgAudioJ

Để chạy nó - bạn phải hoặc là di chuyển lên một thư mục:

Nếu bạn đang ở đây: (Windows) src\es_2011\
chuyển sang src\

Sau đó chạy dòng:

java es_2011.ProgAudioJ

Điều này yêu cầu trình biên dịch tìm ProgAudioJ - nằm trong gói es_2011. Đối với một cài đặt tiêu chuẩn, điều này sẽ được dựa trên các thư mục - vì vậy nó sẽ tìm kiếm thư mục es_2011 đầu tiên, và sau đó tên của tập tin .class mà bạn muốn chạy (ProgAudio).

0

Hãy thử điều này,

  1. Compile lớp học của bạn sử dụng bên dưới lệnh  

    $ javac ProgAudioJ.java -d . 
    
  2. Chạy ứng dụng của bạn bằng cách lệnh

    $ java es_2011.ProgAudioJ 
    
Các vấn đề liên quan