programar programación programacion libro lenguaje ejemplos desde cómo codigos cero algoritmos java jvm return-type

programación - ¿Por qué las Especificaciones de Java quieren que el método principal de un programa se anule solamente?



libro de programacion en java netbeans pdf (12)

Esta pregunta ya tiene una respuesta aquí:

Aunque el tipo de devolución no forma parte de la firma de un método, JVM busca la declaración exacta como

public static void main(String[] args)

Supongo que, dado que la firma del método no incluye el "tipo de devolución", se me debe permitir cambiar el tipo de devolución.

Pero si lo cambio a public static int main(String[] args) y devuelvo un valor, digamos 0, JVM no puede ejecutar el programa y sale con un error

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

¿Por qué las Especificaciones de Java quieren que el método principal sea anulado solamente? ¿Por qué es esta restricción, cuando el tipo de devolución no forma parte de la firma del método?

Esta pregunta es diferente a ¿Por qué main () está en java void? : esta pregunta está cerrada ya que se basa en la opinión, mientras busco el código de lugares / procesos desde donde JVM invoca este método, y cuáles son las limitaciones que los obligan a mantener este método como vacío. ¿Cuáles son las decisiones de diseño que han tomado (y el razonamiento detrás) y dónde se documenta?

Estoy buscando datos para saber la razón por la que se hace. Por favor, no lo marque como duplicado sin pasar por los detalles de la pregunta.

PD: salir, es otra cosa. Estoy más preocupado por la entrada del programa. Además, es posible que el valor devuelto no sea para el uso de JVM, restringiéndolo a la capacidad de extensión de límites nulos.

Hasta ahora, lo que he aprendido de esta pregunta es: las especificaciones de Java han corregido explícitamente el tipo de retorno para evitar confusiones a los programadores migrantes (C / CPP) que pueden esperar que este valor vuelva al sistema operativo, pero como JVM está entre este valor nunca ser devuelto a OS. Para este propósito especial (devolver el valor al sistema operativo) han proporcionado el método System.exit ().

Para todos aquellos que sugieren que el tipo de devolución es parte de la firma: solo intente definir los dos métodos siguientes en una clase

public static void main(String[] a){ } public static String main(String[] a){ }

Recibirá un error de compilación, porque la firma de ambos métodos es la misma.


¿Cuál es el método principal en Java?

El método principal en Java es el punto de entrada para cualquier programa principal de Java. Recuerde que no estamos hablando de Servlet, MIDlet o cualquier otro programa Java administrado por contenedor donde se proporcionan métodos de ciclo de vida para controlar la ejecución . En el programa principal de Java, la ejecución comienza desde el método principal cuando escribe java main-class-name, JVM busca el método main public void static (String args []) en esa clase y, si no encuentra ese método, genera el error NoSuchMethodError : principal y termina.

Firma del método principal en Java.

El método principal tiene que seguir estrictamente su sintaxis; de otra manera, JVM no podrá localizarlo y su programa no se ejecutará. Aquí está la firma exacta del método principal:

Public static void main (String args [])

Esta firma es clásica y existe desde el inicio de Java, pero con la introducción del argumento variable o varargs en Java5, también puede declarar el método principal en Java usando la sintaxis de varargs como se muestra en el siguiente ejemplo:

public static void main (String ... args)

Recuerde que la versión varargs del método principal de Java solo funcionará en Java 1.5 o una versión posterior. Aparte de público, estático y vacío, hay ciertas palabras clave como final, sincronizada y strictfp que están permitidas en la firma del método principal de Java.

Por qué el método principal es estático en Java

¿Por qué el método principal es el vacío estático público en Java? Ahora venga al punto principal "Por qué el método principal es estático en Java", existen varias razones, pero aquí hay algunas razones que tienen sentido para mí:

  1. Como el método principal es estático, la Máquina virtual Java puede llamarlo sin crear ninguna instancia de clase que contenga el método principal.

  2. Como C y C ++ también tienen un método principal similar que sirve como punto de entrada para la ejecución del programa, seguir esa convención solo ayudará a Java.

  3. Si el método principal no se declarara estático, entonces JVM tiene que crear una instancia de la clase principal y, como el constructor puede estar sobrecargado y puede tener argumentos, no habría ninguna forma segura y coherente para que JVM encuentre el método principal en Java.

  4. Todo lo que se declara en clase en Java se incluye en el tipo de referencia y requiere que se cree un objeto antes de usarlos, pero el método estático y los datos estáticos se cargan en una memoria separada dentro del contexto llamado JVM que se crea cuando se carga una clase. Si el método principal es estático, se cargará en el contexto de JVM y estará disponible para su ejecución.

¿Por qué mehtod principal es público en Java?

Java especifica varios modificadores de acceso, por ejemplo, privado, protegido y público. Cualquier método o variable que se declare pública en Java puede ser accesible desde fuera de esa clase. Dado que el método principal es público en Java, JVM puede acceder y ejecutarlo fácilmente.

Por qué el método principal es nulo en Java

Dado que el método main en Java no debe devolver ningún valor, se anula, lo que simplemente significa que main no está devolviendo nada.

Resumen:

  1. El método principal debe declararse público, estático e inválido en Java; de lo contrario, JVM no podrá ejecutar el programa Java.

  2. JVM lanza NoSuchMethodException: main si no encuentra el método principal de firma predefinida en la clase que se proporciona al comando de Java. Por ejemplo, si ejecuta Java Helloworld que JVM, buscará el método público estático void main String args []) en el archivo HelloWorld.class.

  3. El método principal es el punto de entrada para cualquier programa Core Java. La ejecución se inicia desde el método principal.

4. El método principal se ejecuta mediante un subproceso especial denominado subproceso "principal" en Java. Su programa Java se ejecutará hasta que su subproceso principal se ejecute o se ejecute cualquier subproceso no daemon generado a partir del método principal.

  1. Cuando vea "Exception in Thread main", por ejemplo, Exception in Thread main: Java.lang.NullPointerException, significa que se lanza Exception dentro del hilo principal.

  2. Puede declarar el método principal utilizando la sintaxis varargs desde Java 1.5 en adelante, por ejemplo, public static void main (String ... args)

  3. Además de estático, vacío y público, puede usar el modificador final, sincronizado y estricto en la firma del método principal en Java.

  1. El método principal en Java se puede sobrecargar como cualquier otro método en Java, pero JVM solo llamará al método principal con la firma especificada arriba.
  1. Puede usar la cláusula de lanzamientos en la firma del método principal y puede lanzar cualquier Excepción marcada o no marcada.

  2. El bloqueo del inicializador estático se ejecuta incluso antes de que JVM llame al método principal. Se ejecutan cuando una clase se carga en la memoria mediante JVM.

Espero que esto haya respondido a tu pregunta sobre el método principal :)

Actualización en respuesta a:

Un pequeño problema con su respuesta: el tipo de devolución no forma parte de la firma del método ... por lo tanto, JVM no debe lanzar la excepción "NoSuchMethodException: main" si el tipo de devolución es diferente.

no devuelve "NoSuchMethodException: main" si el tipo de retorno es diferente y el tipo de retorno es parte de la firma del método. Echa un vistazo a esta captura de pantalla:


¿Por qué no anular?

Si desea devolver algún estado al sistema operativo, puede utilizar cualquiera de los System.exit(int status) de salida. Uno de los más comunes es System.exit(int status) .

Si su principal termina antes que los otros subprocesos, un valor de retorno no importará. Esto está en contraste con c / c ++ que no admitió multiproceso en ese momento.

Al igual que una aplicación de swing, aún puede funcionar en EDT después de terminar la aplicación principal.

Y si aún está considerando el punto de "entrada": pero el tipo de retorno siempre habla de la salida.

Por lo tanto, es simplemente nulo ya que tenemos indicadores de estado para devolver un valor o no retorno en otro caso. Aún así, no hay otro punto porque se diseñó de esta manera. Otro desarrollador con ideas diferentes podría lanzar otra idea para resolver la misma situación. Depende.


Como se indica en http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.8

12.8. Salida del programa

Un programa termina toda su actividad y sale cuando ocurre una de dos cosas:

Todos los subprocesos que no son daemon terminan.

Algunos hilos invocan el método de salida de la clase Runtime o la clase Sistema, y ​​el administrador de seguridad no prohíbe la operación de salida.

El programa se cierra si todos los subprocesos en ejecución son demonio. Por lo tanto, si tiene un subproceso que no es demonio, el método principal podría regresar antes de que finalice el programa.

La vida útil de su programa puede extender la vida útil del método principal y el número de devolución se puede decidir más adelante en el programa.

Creo que es por esto que usan System.exit () como punto de retorno.


El main is void se especifica en JLS 12.1.4 Invoke Test.main :

El método main debe ser declarado public , static y void .

A veces la respuesta a un ¿por qué? es porque la especificación lo dice (también conocido como Quod Ego Dixit, o Porque yo lo digo (Terry Pratchett)). A veces, las decisiones de un diseñador de idiomas no están disponibles y lo único que podemos hacer es adivinar. Esta es también la razón por la cual el duplicado obvio ( ¿Por qué está main () en java void? ) Está cerrado principalmente como basado en opiniones.

Ahora como la razón obvia para mí: la salida del programa JLS 12.8 dice:

Un programa termina toda su actividad y sale cuando ocurre una de dos cosas:

  • Todos los subprocesos que no son daemon terminan.
  • Algunos hilos invocan el método de exit de la clase Runtime o la clase System , y el administrador de seguridad no prohíbe la operación de salida.

Esto significa que el final del método main no significa necesariamente el final del programa. Un código de retorno de un método main tiene un significado bien conocido en lenguajes como C: es el código de salida del proceso. Este significado no se aplica cuando el método main puede salir mucho antes de que finalice el proceso.

La mayoría de las aplicaciones Java no triviales tienen, por lo general, un método principal de corta duración que inicia uno o más subprocesos no daemon de larga duración. Permitir un código de retorno desde un método main Java podría implicar un significado que no está realmente allí: que el valor de retorno es el código de salida del proceso. Por lo tanto, especificar explícitamente que main debe tener un tipo de retorno nulo es bueno: reduce la confusión o asigna un significado que no existe.


El método principal no puede ser un punto de salida después de todo. Debido a los subprocesos múltiples, puede suceder que cuando vuelva el principal, todavía haya otro hilo en el tono que mantiene el programa activo. Un código de salida no tiene sentido en este caso.


Java ha sido diseñado como un Platform independent language . Entonces, si el método main() devuelve un valor (como 0 o 1 o algo), puede ser interpretado o entendido de manera diferente por una plataforma diferente. Entonces, a diferencia de C y Cpp , el método main() no puede devolver un valor.


La razón principal es que en los casos de uso comunes, particularmente en aplicaciones de subprocesos múltiples y GUI, no prefiere tener un valor de retorno en main. Pero si realmente tiene tal caso de uso, puede usar el método de salida. Esta es la razón por la que estás buscando.


No puede mirar a continuación desde Java Docs. Para que su método principal le sirva como punto de salida, debe tener el método nulo. o tienes una opción para llamar a system.exit () explícitamente al final de tu main.

Termina la Java Virtual Machine actualmente en ejecución. El argumento sirve como un código de estado; por convención, un código de estado distinto de cero indica una terminación anormal.


Podemos decir, método main como método de iniciación de clase, ya que satisface uno de los criterios de iniciación de clase; Consulte http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.4 , 12.4.1 section--

T es una clase y se invoca un método estático declarado por T

Ahora, según la especificación de JVM, la instrucción de retorno se usa para regresar de los métodos declarados nulos, los métodos de inicialización de instancia y los métodos de inicialización de clase o interfaz . http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.11.8

Consulte los detalles sobre las instrucciones de devolución aquí: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10.1.9.return


Según mi conocimiento,

La razón por la cual el método main tiene el void como tipo de retorno es que, una vez que el método main finaliza su ejecución, no significa que todo el programa haya finalizado. Puede tener algunos hilos iniciados y ejecutándose detrás de la escena. Incluso si el subproceso principal está muerto, todavía existe la posibilidad de que se estén ejecutando subprocesos secundarios. En este caso, el tipo de retorno de main no tiene mucho sentido.

Y JVM supervisará el estado de finalización del programa para desasignar la memoria. No es necesario devolver algo a JVM que JVM que el programa ha finalizado. En lenguaje C, nos estamos comunicando directamente con el sistema operativo, por lo que hay una opción para devolver el valor int al sistema operativo que indica que la ejecución se ha realizado y comenzar a desasignar la memoria. Pero aquí en Java, JVM se comunicará con el sistema operativo, pero no con el programa, por lo que no necesitamos devolver nada de main.

Espero que esto aclare tu duda.


Si le pide a JVM que ejecute una clase, el tiempo de ejecución de Java buscará exactamente esa firma en su clase public static void main(String[] args) Ese es su contrato con la JVM, de lo contrario, no se ejecutará. Si desea un código int, vuelva a utilizar System.exit


Un programa de consola devuelve un código de retorno int, y por lo tanto, en un programa C tradicional, un int main(int argc, char** argv) parece lógico.

En Java, la excepción se introdujo como un nuevo mecanismo de flujo de control, y también se simularon o implementaron múltiples subprocesos . La salida se puede hacer en cualquier lugar con System.exit(int returnCode) .

Esto significa que la llamada a main está incrustada en un fragmento de código, y más limpio (minimalista, menos casos, sin magia de return 0 ) tiene un valor predeterminado de devolución de 0, excepto por System.exit .

La mente, Java tenía la intención de "mejorar" fuertemente en C y especialmente en C ++. Como tener cadenas y caracteres que utilizan Unicode completo en lugar de byte.