"Error: método principal no encontrado en la clase MyClass, defina el método principal como..."
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?
Cuando utiliza el java
comando 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:
- El método debe estar en la clase nominada.
- El nombre del método debe ser "principal" con exactamente esa capitalización 1 .
- El método debe ser
public
. - El método debe ser
static
2 . - El tipo de retorno del método debe ser
void
. - El método debe tener exactamente un argumento y el tipo de argumento debe ser
String[]
3 .
(El argumento se puede declarar usando varargs
sintaxis; 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 java
comando 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 main
mé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: String
debe ser la java.lang.String
clase estándar y no una clase personalizada denominada String
que oculta la clase estándar.
El problema es que no tienes un public void main(String[] args)
método en la clase que intentas invocar.
Él
- debe ser
static
- 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.
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 VM
especificación (segunda edición citada). Como main
no 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