porque nome errado com NoClassDefFoundError

Eu criei um arquivo List.java na pasta UtilityPack que contém este código

 package Utilities; public class List { private class node{} public void insert(int data){} public void print(){} public static void main(String[] s){} } 

Para compilar eu fiz

 C:\UtilityPack>javac List.java 

Mas quando tento correr com

 C:\UtilityPack>java -classpath . List 

OU

 C:\UtilityPack>java List 

Eu recebo erro

 Exception in thread "main" java.lang.NoClassDefFoundError: List (wrong name: Uti lities/List) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:791) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14 2) at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) at java.net.URLClassLoader.access$100(URLClassLoader.java:71) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 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:423) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482) 

Eu tenho tentado executar este programa das últimas 3 horas, mas nada funcionou.

Você precisa do nome totalmente qualificado, por exemplo

 java -cp . Utilities.List 

isto é, você está dizendo à JVM para olhar a partir da corrente direta ( -cp . ) para uma class Utilities.List , que ela espera no arquivo Utilities\List.class .

Para ser mais consistente, você deve colocar o arquivo .java em um diretório de Utilities (sim – isso é tautológico – o pacote especifica isso, mas é uma prática consistente).

Também evito ligar para a sua List turma. Em algum momento você vai importar um java.util.List e tudo ficará muito confuso!

Finalmente, assim que você tiver mais do que algumas classs, investigue a formiga ou outra ferramenta de compilation e separe seus diretórios de source e de target .

Use o nome completo da class para lançar seu programa:

  java Utilities.List 

Mas o nome da pasta também deve corresponder ao nome do pacote.

Sua estrutura de diretórios precisa seguir o caminho do seu pacote Java. IOW, se a class List estiver no pacote Utilities , você precisa situá-la em um diretório chamado Utilities, que deve estar no nível raiz do seu projeto, ou seja, o caminho do arquivo de origem deve ser C: \ UtilityPack \ Utilities \ List.java . Quando você está em C: \ UtilityPack (raiz do projeto), compile e execute List referenciando-o como Utilities.List .

Você também pode considerar o uso do Eclipse, ele evitará que esse tipo de coisa aconteça ou qualquer outro IDE Java.