Este es el primer artículo en el que voy a tratar dificultades del examen de certificación OCAJ8P. En este en concreto, te voy a explicar en qué consiste el método main() en Java y, lo que es más importante, te voy a señalar las variantes válidas que existen de este método.
More...
¿Por qué es importante hilar tan fino?
Sí, ya sé que es probable que en el 99% de ocasiones en las que te encuentres este método lo vas a ver tal y como aparece en el gif, pero el examen de certificación de Oracle tiende a poner trampas en las que puede caer cualquiera. ¿Y sabes por qué? Porque a menudo el examen parece que te está preguntando sobre una cosa, pero en realidad el problema está en otra parte. Por ejemplo, imagínate que tienes ante ti unas cuantas líneas de código, con unas cuantas lambdas. Miras y remiras las lambdas y llegas a la conclusión, correcta, de que no hay ningún error. Y de ahí deduces que el código funciona a la perfección.
Pues no, resulta que el código compila pero no se ejecuta porque el método main() en Java no se puede llamar Main():
En este caso se ve muy claro, pero en el examen estás demasiado nervioso, y demasiado centrado en las lambdas, como para fijarte.
¡Las preguntas del examen de certificación de Java OCAJ8P tienen trampas ocultas!
Estructura del método main() en Java
Lo que debes saber en primer lugar es que el método main() es el punto de entrada de la aplicación, es decir, es el punto en el que comienza la ejecución de esta. Es por ello que ha de ser public y static.
Ha de ser público y estático
Al ser el punto de entrada, ha de ser accesible desde fuera de la clase en la que se encuentra. Además, al ser lo primero que se ejecuta, ha de ser posible su ejecución antes de instanciar un objeto.
Además, ha de tener un tipo de devolución void
Como consecuencia directa de ser la primera línea de código que se ejecuta, no tiene sentido que tenga un tipo de devolución distinto de void, ya que no hay un código anterior que pueda hacer algo con ese valor. El método main() en Java siempre tiene un tipo de devolución void.
A continuación, ha de llamarse main(), en minúscula
El método main() ha de llamarse main, en minúscula. A la hora de ejecutar el código, el entorno de ejecución de Java (JRE) busca el punto de entrada predeterminado. El JRE solo sabe que es un método llamado main. Si no lo encuentra, no puede acceder. Es por ello que puedes considerar main como una palabra clave de acceso. Si la cambias, tu aplicación no se ejecutará.
Por último, ha de aceptar un único parámetro: una matriz String[]
El método main() acepta un parámetro (y solo uno): una matriz de tipo String. Esta matriz recoge los valores que introduzcas a la hora de ejecutar tu aplicación desde la línea de comandos. Da igual el valor que introduzcas; el JRE lo transformará a String.
Hasta aquí, he explicado el mínimo básico que tienes que saber sobre el método main() en Java. No obstante, existe una serie de momentos a los que tienes que prestar atención. El método main() tiene variantes correctas, que se ejecutan perfectamente, y variantes que no van a ejecutarse.
Cuando NO va a compilar el método main() en Java
Antes de seguir, ten en cuenta que el método main() no compila solo en dos casos:
Este último tiene truco, ya que si tiene el return va a compilar, pero va a provocar un error de tiempo de ejecución (Runtime error) en la línea 7.
Cuándo NO se va a ejecutar el método main() en Java
Como puedes deducir de lo que has leído más arriba, el método main() no se ejecutará cuando no respete las reglas que te he enunciado. Si ves que el método es private en lugar de public, si le falta ser static, si se llama Main, si el parámetro es String en lugar de String[]... Asegúrate de que el método main() sigue las reglas.
Cuando SÍ se va a ejecutar el método main() en Java
Aparte de la forma predeterminada en la que suele aparecer y que te he mostrado al inicio de este artículo, hay varias "variantes" del método main() que son totalmente válidas y que pueden aparecer en el examen de certificación.
public static vs. static public
Las palabras clave public y static son intercambiables, de manera que pueden aparecer en cualquier orden.
main() puede ser final
El método main() puede ser final y, junto con public y static, puede aparecer en cualquier orden.
El método main() acepta varargs
El parámetro de main() no tiene que ser necesariamente una matriz String[], también puede ser String...
Recuerda, también, que una matriz se puede declarar tanto así:
Como así:
Esto también se aplica al parámetro de main().
El parámetro puede recibir cualquier nombre
El parámetro se llama args de manera predeterminada, pero el método main() se va a ejecutar sin problema independientemente del nombre del parámetro. Tú en tu código llámalo siempre args, pero en el examen espera encontrarte cualquier cosa.