2010-03-02 10 views
5

¿qué estoy haciendo mal aquí:'Excepción en hilo java.lang.NoClassDefFoundError 'principal'' cuando el programa Java se ejecuta desde la línea de comandos

class Helo { 
    // main: generate some simple output 
    public static void main (String[] args) { 
     System.out.println ("Hello, world."); // print one line 
     System.out.println ("How are you?"); // print another 
    } 
} 

Cuando entro en la terminal que hago:

cd ~ 
javac Atempt2.java (//that's the file name) 
java Atempt2 

y luego me da este mensaje de error:

Exception in thread "main" java.lang.NoClassDefFoundError: Atempt2 

Así que en general esto es lo que hago y lo que sucede:

david-allenders-macbook-pro:~ davidallender$ cd ~ 
david-allenders-macbook-pro:~ davidallender$ javac Atempt2.java 
david-allenders-macbook-pro:~ davidallender$ java Atempt2 
Exception in thread "main" java.lang.NoClassDefFoundError: Atempt2 
david-allenders-macbook-pro:~ davidallender$ 

Soy muy nuevo en esto así que por favor explique las cosas de una manera muy simple.

Gracias.

+2

¿Qué tutorial sigues? ¿Dónde has visto ejemplos de código como este? –

+1

Recomiendo encarecidamente seguir los propios "Trails Covering the Basics" del proveedor http://java.sun.com/docs/books/tutorial/ – BalusC

+0

¿Compila? – fastcodejava

Respuesta

6

cambiar el nombre de Atempt2.java a Hello.java para ponerse en marcha, entonces:

javac Helo.java 
java Helo 

Ver here for more discussion and the reasoning.

+0

o nombre la clase dentro del archivo 'Atempt2' – akf

+2

Renombrar resolverá el problema, pero no explica lo que está sucediendo en este momento. –

9

Ha pasado un tiempo desde que hice algún trabajo en Java, pero estoy bastante seguro de que su nombre de clase debe coincidir con su nombre de archivo.

+2

Esta es la segunda vez que veo esta declaración hoy, y todavía está mal. Las clases * públicas * deben coincidir con el nombre del archivo, pero el código publicado no es una clase pública. –

+1

@mmyers: Sí, el código que se publica correctamente no es de clase pública, pero el método principal debe estar en la clase pública del programa. – giri

+0

@girinie: No, eso tampoco es cierto; la clase con el método principal puede ser de paquete privado. Te recomendaría mi comentario sobre la respuesta de skaffman, pero la respuesta ha sido eliminada. –

1

El nombre de archivo debe coincidir con el nombre public class definido en el archivo. En este caso, tendrá que nombrar el archivo "Helo.java" o renombrar la clase como Atempt2.

+1

Esto es cierto, pero no hay 'clase pública' definida en el archivo, lo que lo hace irrelevante para la pregunta inmediata. –

3

cambio:

class Helo 

a

class Atempt2 

en el archivo de origen.

Un archivo .java que declara una clase debe tener el nombre del archivo que coincida con el nombre de la clase declarada.

+1

No es del todo correcto; por favor vea mi comentario sobre la respuesta de Robert Davis. –

7

javac usa el nombre de clase para generar la salida, no el nombre del archivo. Por lo tanto, generará un archivo de clase Helo.class.
java tomará un nombre de clase y llamará a la función principal en el archivo de clase correspondiente, aquí Hello.class.

El ClassNotFoundError se produce porque javac nunca generó un archivo de clase Atemp2 ya que no hay clase Atemp2 en su archivo fuente.

+0

+1: Esta es la única respuesta correcta publicada hasta el momento que tampoco engaña al OP. –

1

Esto es lo más básico para comenzar con la programación Java. Cualquier programa que escriba el nombre del archivo debe coincidir con la clase pública del programa. Aquí en su programa, la clase pública del archivo es Helo, por lo que su nombre de archivo debe ser Helo.java. Aquí el compilador puede compilar, pero JVM buscará el archivo Helo.class para ejecutar. Como no hay ningún archivo Helo.class que está recibiendo excepción de ejecución Excepción en el hilo "principal" java.lang.NoClassDefFoundError: Atempt2

+1

Por favor, consulte mis comentarios a William Brendel y skaffman. –

1

para complementar josefx 's respuesta.

El argumento para el compilador (javac) es el nombre del archivo o archivos para compilar (como lo hizo).

Por otro lado, la máquina virtual (java) obtiene el nombre de la clase cuyo método main se va a ejecutar.

Una opción sería

javac Atempt2.java // the file name 
java Helo    // the class name 

Normalmente es una buena idea tener el archivo con el nombre de la misma manera que la clase. Para public class, esto es obligatorio (comprobado por el compilador).

Cuestiones relacionadas