"Error: método principal no encontrado en la clase MyClass, defina el método principal como..."

Resuelto Stephen C asked hace 13 años • 11 respuestas

Los nuevos programadores de Java suelen encontrar mensajes como el siguiente cuando intentan ejecutar un programa Java. (Las diferentes herramientas Java, IDE, etc. brindan una variedad de diagnósticos para este problema).


Error: Main method not found in class MyClass, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

Error: Main method not found in the file, please define the main method as: 
   public static void main(String[] args)

Error: Main method is not static in class MyClass, please define the main method as:
   public static void main(String[] args)

Error: Main method must return a value of type void in class MyClass, please
define the main method as:
   public static void main(String[] args)

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

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

Stephen C avatar Mar 23 '11 22:03 Stephen C
Aceptado

Cuando utiliza el javacomando 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, busca un método que se declare de la siguiente manera:

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

Los requisitos específicos para el método del 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 retorno 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 se puede declarar usando varargssintaxis; por ejemplo String... args, consulte esta pregunta para obtener más información. El String[]argumento se usa para pasar los argumentos desde la línea de comando y es necesario incluso si su aplicación no acepta argumentos de línea de comando).

Si alguno de los requisitos anteriores no se cumple, el javacomando fallará con alguna variante del mensaje:

Error: Main method not found in class MyClass, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

O, si está ejecutando una versión muy antigua de Java:

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

Si encuentra este error, verifique que tenga un mainmétodo y que cumpla con los seis requisitos enumerados anteriormente.


1 - Una variación realmente oscura de esto es cuando uno o más de los caracteres en "principal" NO es un carácter LATIN-1... sino un carácter Unicode que se parece al carácter LATIN-1 correspondiente cuando se muestra.
2 - Aquí hay una explicación de por qué se requiere que el método sea estático.
3: Stringdebe ser la java.lang.Stringclase estándar y no una clase personalizada denominada Stringque oculta la clase estándar.

Stephen C avatar Mar 23 '2011 15:03 Stephen C

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

Él

  • debe serstatic
  • debe tener exactamente un argumento de matriz de cadenas (que puede tener cualquier nombre)
  • debe escribirse principal en minúsculas.

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

Thorbjørn Ravn Andersen avatar Mar 23 '2011 15:03 Thorbjørn Ravn Andersen

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

La fuente más autorizada es la VMespecificación (segunda edición citada). Como mainno es una característica del lenguaje, no se considera en la Especificación del lenguaje Java.

  • 2.17.1 Ejecución: Inicio de la máquina virtual
  • 5.2 Inicio de la máquina virtual

Otro buen recurso es la documentación del propio iniciador de aplicaciones:

  • java: el lanzador de aplicaciones Java
 avatar Mar 23 '2011 15:03