seticon redimensionar icon clase java syntax keyword goto

redimensionar - ¿Hay una declaración goto en Java?



scale icon java (23)

¿Porque no es compatible y por qué querría una palabra clave goto que no hizo nada o una variable llamada goto ?

Aunque puedes usar break label; y continue label; Declaraciones para hacer efectivamente lo que hace goto . Pero no lo recomendaría.

public static void main(String [] args) { boolean t = true; first: { second: { third: { System.out.println("Before the break"); if (t) { break second; } System.out.println("Not executed"); } System.out.println("Not executed - end of second block"); } System.out.println("End of third block"); } }

Estoy confundido acerca de esto. A la mayoría de nosotros se nos ha dicho que no hay ninguna declaración goto en Java.

Pero encontré que es una de las palabras clave en Java. ¿Donde puede ser usado? Si no se puede usar, ¿por qué se incluyó en Java como palabra clave?


Así que podrían usarse algún día si los diseñadores de idiomas sintieran la necesidad.

Además, si los programadores de lenguajes que tienen estas palabras clave (por ejemplo, C, C ++) los usan por error, entonces el compilador de Java puede dar un mensaje de error útil.

O tal vez fue solo para detener a los programadores usando goto :)


Como se señaló, no hay goto en Java, pero la palabra clave estaba reservada en caso de que Sun tuviera ganas de agregar goto a Java algún día. Querían poder agregarlo sin romper demasiado código, por lo que reservaron la palabra clave. Tenga en cuenta que con Java 5 agregaron la palabra clave enum y tampoco rompió tanto código.

Aunque Java no tiene goto , tiene algunas construcciones que corresponden a algunos usos de goto , a saber, ser capaz de break y continue con bucles con nombre. Además, finally , finally puede considerar como una especie de goto retorcido.


Es importante comprender que el constructo goto es un remanente de los días programados por los programadores en código de máquina y lenguaje ensamblador. Debido a que esos lenguajes son tan básicos (como en, cada instrucción hace solo una cosa), el flujo de control del programa se realiza completamente con sentencias goto (pero en lenguaje ensamblador, estas se denominan instrucciones de salto o ramificación ).

Ahora, aunque el lenguaje C es de un nivel bastante bajo, puede considerarse como un lenguaje ensamblador de muy alto nivel: cada declaración y función en C se puede dividir fácilmente en instrucciones en lenguaje ensamblador. Aunque C no es el lenguaje principal para programar computadoras con la actualidad, todavía se usa mucho en aplicaciones de bajo nivel, como los sistemas integrados. Debido a que la función de C refleja fielmente la función del lenguaje ensamblador, solo tiene sentido que goto esté incluido en C.

Está claro que Java es una evolución de C / C ++. Java comparte muchas características de C, pero resume muchos más detalles y, por lo tanto, está escrito de manera diferente. Java es un lenguaje de muy alto nivel, por lo que simplemente no es necesario tener características de bajo nivel como goto cuando hay más construcciones de alto nivel como funciones, para cada uno, y mientras que los bucles hacen el flujo de control del programa. Imagínese si estuviera en una función e hiciera un goto a una etiqueta en otra función. ¿Qué pasaría cuando la otra función regresara? Esta idea es absurda.

Esto no necesariamente responde por qué Java incluye la instrucción goto pero aún no permite que se compile, pero es importante saber por qué se usó goto en primer lugar, en aplicaciones de nivel inferior, y por qué simplemente no tiene sentido para ser utilizado en Java.


Es muy considerado como una de esas cosas que no haces, pero probablemente fue incluido como una palabra reservada para evitar confusiones para los desarrolladores.


Están reservados para uso futuro (ver: Palabras clave del lenguaje Java )

Las palabras clave const y goto están reservadas, aunque no se utilicen actualmente.

La razón por la que no hay una declaración goto en Java se puede encontrar en " El entorno del lenguaje Java ":

Java no tiene ninguna declaración goto. Los estudios ilustran que goto se usa (mal) con más frecuencia que simplemente "porque está ahí". Eliminar goto condujo a una simplificación del lenguaje; no hay reglas sobre los efectos de un goto en el medio de una declaración for, por ejemplo. Los estudios en aproximadamente 100,000 líneas de código C determinaron que aproximadamente el 90 por ciento de las declaraciones goto se utilizaron únicamente para obtener el efecto de romper los bucles anidados. Como se mencionó anteriormente, la interrupción multinivel y continuar eliminan la mayor parte de la necesidad de declaraciones goto.


James Gosling creó la JVM original con soporte para goto sentencias, pero luego eliminó esta característica por innecesaria. La razón principal por la que no es necesario goto es que generalmente se puede reemplazar con declaraciones más legibles (como break/continue ) o extrayendo un fragmento de código en un método.

Fuente: James Gosling, sesión de preguntas y respuestas.


La palabra clave existe, pero no está implementada.

La única buena razón para usar goto que se me ocurre es la siguiente:

for (int i = 0; i < MAX_I; i++) { for (int j = 0; j < MAX_J; j++) { // do stuff goto outsideloops; // to break out of both loops } } outsideloops:

En Java puedes hacer esto así:

loops: for (int i = 0; i < MAX_I; i++) { for (int j = 0; j < MAX_J; j++) { // do stuff break loops; } }


No, goto no se usa en Java, a pesar de ser una palabra reservada. Lo mismo es cierto para const . Ambos se utilizan en C ++, que es probablemente la razón por la que están reservados; la intención era probablemente evitar confundir a los programadores de C ++ que migran a Java, y quizás también mantener la opción de usarlos en revisiones posteriores de Java.


No, afortunadamente, no hay goto en Java.

La palabra clave goto solo está reservada, pero no se usa (lo mismo ocurre con const ).


No, no se utiliza goto , pero puede definir etiquetas y dejar un bucle hasta la etiqueta. Puedes usar break o continue seguido de la etiqueta. Así que puedes saltar más de un nivel de bucle. Echa un vistazo al tutorial .


Para evitar que las personas sean asesinadas por los velociraptores.


Por supuesto, es una palabra clave, pero no se usa en el nivel del código fuente.

Pero si usa jasmin u otro lenguaje de nivel inferior, que se transforma en bytecode, entonces "goto" está ahí


Porque aunque el lenguaje Java no lo usa, el bytecode JVM sí lo hace.


Prohibir declaraciones de variables con el mismo nombre.

por ejemplo, int i = 0, goto;


Tampoco soy fan de goto , ya que generalmente hace que el código sea menos legible. Sin embargo, creo que hay excepciones a esa regla (¡especialmente cuando se trata de lexers y analizadores!)

Por supuesto, siempre puedes llevar tu programa a Kleene Normalform al traducirlo a algo como un ensamblador y luego escribir algo como

int line = 1; boolean running = true; while(running) { switch(line++) { case 1: /* line 1 */ break; case 2: /* line 2 */ break; ... case 42: line = 1337; // goto 1337 break; ... default: running = false; break; } }

(Así que básicamente escribe una máquina virtual que ejecuta su código binario ... donde la line corresponde al puntero de instrucción)

Eso es mucho más legible que el código que usa goto , ¿no es así?


Tenga en cuenta que puede reemplazar la mayoría de los usos benignos de goto por

  • regreso

  • descanso

  • etiqueta de rotura

  • tirar dentro de try-catch-finalmente


Un ejemplo de cómo usar las etiquetas de "continuar" en Java es:

public class Label { public static void main(String[] args) { int temp = 0; out: // label for (int i = 0; i < 3; ++i) { System.out.println("I am here"); for (int j = 0; j < 20; ++j) { if(temp==0) { System.out.println("j: " + j); if (j == 1) { temp = j; continue out; // goto label "out" } } } } System.out.println("temp = " + temp); } }

Resultados:

I am here // i=0 j: 0 j: 1 I am here // i=1 I am here // i=2 temp = 1






La lista de palabras clave de Java especifica la palabra clave goto , pero está marcada como "no utilizada".

Estaba en la JVM original (ver respuesta por @VitaliiFedorenko ), pero luego se eliminó. Probablemente se mantuvo como una palabra clave reservada en caso de que se agregara a una versión posterior de Java.

Si goto no estaba en la lista, y se agrega al lenguaje más adelante, el código existente que usaba la palabra goto como un identificador (nombre de variable, nombre de método, etc.) se rompería. Pero debido a que goto es una palabra clave, dicho código ni siquiera se compilará en el presente, y sigue siendo posible hacer que haga algo más adelante, sin romper el código existente.