java main nosuchmethoderror

Causas de ''java.lang.NoSuchMethodError: excepción principal en el hilo "main"''



(7)

Los nuevos programadores Java a menudo encuentran este mensaje cuando intentan ejecutar un programa Java:

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

¿Qué significa esto, qué puede causarlo y qué debe uno hacer para solucionarlo?


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

java some.AppName arg1 arg2 ...

el comando carga la clase que nominó, y luego busca el método de punto de entrada llamado main . Más específicamente, está buscando un método que se declare de la siguiente manera:

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 estar en la clase nominada.
  2. El nombre del método debe ser "principal" con exactamente esa capitalización 1 .
  3. El método debe ser public .
  4. El método debe ser static 2 .
  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[] 3 .

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

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

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

Si encuentra este error, verifique que tenga un método main y que cumpla con los 6 requisitos mencionados anteriormente.

1 - Una variación realmente oscura de esto es cuando uno o más de los caracteres en "main" NO es un carácter LATIN-1 ... sino un carácter Unicode que se parece al personaje LATIN-1 correspondiente cuando se muestra.

2 - Consulte ¿Por qué el método principal de Java estático? para una explicación de por qué se requiere que el método sea estático.

3 - La String debe corresponder a java.lang.String y no a una clase personalizada llamada String oculta.


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 si publicara el código que causó el error y el contexto en el que se ejecutó el código.

Esto podría haber sucedido si el usuario intentó ejecutar un archivo .class o un archivo .jar que no tiene un método main : en Java, el método main es el punto de entrada para comenzar a ejecutar el programa.

Normalmente se supone que el compilador evita que esto ocurra, por lo que si esto ocurre, 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 en tiempo de compilación.

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

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


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

Eso

  • debe ser static
  • debe tener exactamente un argumento de matriz String (que se puede denominar cualquier cosa)
  • debe escribirse main en minúsculas.

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


En general, significa que el programa que está tratando de ejecutar no tiene un método "principal". Si va a ejecutar un programa Java, la clase que se está ejecutando 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 debería compilarse y ejecutarse sin problemas: si a main se le llamaba algo más, o no era estático, generaría el error que experimentaba.

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


Otras respuestas están haciendo un buen trabajo de 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 de 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 iniciador de aplicaciones en sí:


Si está ejecutando la clase correcta y la principal está correctamente definida, también verifique si tiene una clase llamada String definida en el mismo paquete. Se tendrá en cuenta esta definición de clase String y, como no confirma a main(java.lang.String[] args) , obtendrá la misma excepción.

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

La sugerencia es nunca esconder las clases de biblioteca de Java en su paquete.


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

java.lang.NoSuchMethodError: No virtual method