2011-03-23 24 views
48

programadores Java Nueva menudo se encuentran con este mensaje cuando intentan ejecutar un programa Java:'java.lang.NoSuchMethodError: Excepción principal de hilo 'principal''

java.lang.NoSuchMethodError: main Exception in thread "main" 

Lo que quiere decir esto, ¿qué puedo causarlo, y ¿qué debe uno hacer para solucionarlo?

+0

sólo una suposición que están llamando a una función que no existe, pero el compilador es para parar si usted fuera a hacer eso. – eternalmatt

+0

Wikición completa. –

+0

@eternalmatt: este es un caso que el compilador no puede resolver. Ver mi respuesta para más detalles. –

Respuesta

33

Cuando se utiliza el comando java para ejecutar una aplicación Java desde la línea de comandos, por ejemplo,

java some.AppName arg1 arg2 ... 

los comando carga la clase que usted designado, y luego mira para el método de punto de entrada llamado main. Más específicamente, se está buscando un método que se declara como sigue:

package some; 
public class AppName { 
    ... 
    public static void main(String[] args) { 
     // body of main method follows 
     ... 
    } 
} 

Los requisitos específicos para el método de punto de entrada son:

  1. El método debe ser nominado en la clase.
  2. El nombre del método debe ser "principal" con exactamente esa capitalización .
  3. El método debe ser public.
  4. El método debe ser static .
  5. El tipo de devolución del método debe ser void.
  6. El método debe tener exactamente un argumento y el tipo de argumento debe ser String[] .

El argumento puede ser declarado usando la sintaxis varargs; p.ej. String... args. Ver https://stackoverflow.com/a/36803396/139985. El argumento String[] se usa para pasar los argumentos de la línea de comando, y es necesario incluso si su aplicación no toma argumentos de línea de comando.

Si cualquiera de los requisitos anteriores no se cumple, el comando java fallará con el mensaje:

java.lang.NoSuchMethodError: main Exception in thread “main” 

Si se produce este error, compruebe que dispone de un método main y que satisface todos los 6 de los requisitos enumerados anteriormente.


1 - Una variación muy oscura de esto es cuando uno o más de los personajes de "principal" no es un latino de 1 carácter ... pero un carácter Unicode que se parece a la correspondiente AMÉRICA -1 carácter cuando se muestra.

2 - Consulte Why is the Java main method static? para obtener una explicación de por qué se requiere que el método sea estático.

3 - String debe corresponder a java.lang.String y no una clase personalizada denominada String ocultarlo.

+3

La clase no tiene que ser pública en realidad. Al menos no en la práctica, no sé si tal vez haya una especificación que lo requiera, pero 'java' puede invocar una clase no pública que tenga un método principal público. –

+0

Gracias ... actualizado. –

14

El problema es que no tiene un método public void main(String[] args) en la clase que intenta invocar.

Se

  • debe ser static
  • debe tener exactamente un argumento de matriz de cadena (que puede ser cualquier nombre)
  • debe escribirse m-A-IN en minúsculas.

Tenga en cuenta que usted realmente ha especificado una clase existente (de lo contrario, el error habría sido diferente), pero esa clase carece del método principal.

3

El nombre de la excepción sugiere que el programa intentó llamar a un método que no existe. En este contexto, parece que el programa no tiene un método main, aunque sería útil publicar el código que causó el error y el contexto en el que se ejecutó el código.

esto podría haber ocurrido si el usuario ha intentado ejecutar un archivo o un archivo .class.jar que no tiene un método main - en Java, el método main es el punto de entrada para iniciar la ejecución del programa.

Normalmente se supone que el compilador evita que esto ocurra, por lo tanto, si esto sucede, generalmente se debe a que el nombre del método que se está llamando se está determinando en tiempo de ejecución en lugar de compilar.

Para solucionar este problema, un nuevo programador debe agregar el método midding (suponiendo todavía que es main que falta) o cambiar la llamada a un método para el nombre de un método que no existe.

Leer más sobre el método principal aquí: http://csis.pace.edu/~bergin/KarelJava2ed/ch2/javamain.html

+0

El compilador no puede hacer frente a esto. No se sabe si el usuario * va a * usar la clase que está compilando como un "punto de entrada" para el programa y, por lo tanto, si existe un método * main * apropiado * que deba existir *. –

1

En general, esto significa que el programa que está intentando ejecutar no tiene un método "principal". Si va a ejecutar un programa Java, la clase en ejecución debe tener un método main

Por ejemplo, en el archivo Foo.java

public class Foo { 
    public static void main(args[]) { 
     System.out.println("hello"); 
    } 
} 

Este programa debe compilar y ejecutar ningún problema - si main fue llamado algo más, o no era estático, generaría el error que experimentó.

Cada programa ejecutable, independientemente de su idioma, necesita un punto de entrada, para decirle al intérprete, sistema operativo o máquina dónde iniciar la ejecución. En el caso de Java, este es el método estático main, que se pasa el parámetro args[] que contiene los argumentos de la línea de comando.
es equivalente a int main(int argc, char** argv) en C

8

Otras respuestas están haciendo un buen trabajo al resumir los requisitos de main. Quiero reunir referencias sobre dónde están documentados esos requisitos.

La fuente más autorizada es la especificación VM (segunda edición citada). Como main no es una función de idioma, no se considera en la Especificación de idioma de Java.

Otro buen recurso es la documentación para el propio lanzador de aplicaciones:

5

Si está ejecutando la correcta class y main están definidos correctamente, también verifica si tienes una clase llamada String definida en el mismo paquete. Se tendrá en cuenta esta definición de clase String y, dado que no confirma al main(java.lang.String[] args), obtendrá la misma excepción.

  • No es un error de tiempo de compilación ya que el compilador simplemente asume que está definiendo un método principal personalizado.

Suggestion is to never hide library java classes in your package.

0

me siento las respuestas anteriores pierda un escenario en el que se produce este error incluso cuando el código tiene un main(). Cuando usa JNI que usa Reflection para invocar un método. Durante el tiempo de ejecución si no se encuentra el método, obtendrá un

java.lang.NoSuchMethodError: No virtual method

+0

Ese no es el mensaje de error que explica la Pregunta. La pregunta es específicamente sobre un método "principal" que falta. (Y por favor no me digas que no es ... porque lo escribí). Si quieres abordar un escenario diferente, no dudes en abrir una Pregunta diferente y auto-responderla). –

Cuestiones relacionadas