Ich bin verwirrt darüber. Den meisten von uns wurde gesagt, dass es in Java keine goto-Anweisung gibt.
Aber ich fand, dass es eines der Schlüsselwörter in Java ist. Wo kann es verwendet werden? Wenn es nicht verwendet werden kann, warum wurde es dann in Java als Schlüsselwort aufgenommen?
Antworten:
Die Java-Schlüsselwortliste gibt das
goto
Schlüsselwort an, wird jedoch als "nicht verwendet" markiert.Es war in der ursprünglichen JVM (siehe Antwort von @VitaliiFedorenko ), wurde dann aber entfernt. Es wurde wahrscheinlich als reserviertes Schlüsselwort beibehalten, falls es einer späteren Version von Java hinzugefügt werden sollte.
Wenn dies
goto
nicht in der Liste enthalten ist und später zur Sprache hinzugefügt wird, wird der vorhandene Code, der das Wortgoto
als Bezeichner verwendet (Variablenname, Methodenname usw.), beschädigt. Da es sich jedochgoto
um ein Schlüsselwort handelt, wird ein solcher Code in der Gegenwart nicht einmal kompiliert, und es bleibt möglich, ihn später tatsächlich dazu zu bringen, etwas zu tun, ohne vorhandenen Code zu beschädigen.quelle
This was probably done in case it were to be added to a later version of Java.
Eigentlich ist der Hauptgrund ein bisschen anders (siehe meine Antwort unten)James Gosling erstellte die ursprüngliche JVM mit Unterstützung von
goto
Aussagen, entfernte diese Funktion jedoch als unnötig. Der Hauptgrundgoto
ist unnötig, dass es normalerweise durch besser lesbare Anweisungen (wiebreak/continue
) oder durch Extrahieren eines Codeteils in eine Methode ersetzt werden kann.Quelle: James Gosling, Q & A-Sitzung
quelle
goto
ist die readyble und klare Art und Weise etwas zum Ausdruck bringen, so es sonst zu nichts zwingt , ist notgedrungen weniger lesbar .Das Schlüsselwort ist vorhanden, wird jedoch nicht implementiert.
Der einzige gute Grund, goto zu verwenden, den ich mir vorstellen kann, ist folgender:
In Java können Sie dies folgendermaßen tun:
quelle
break loops
bedeutet "Ausbruch aus der aufgerufenen Schleifeloops
". Vielleicht wäre im Nachhinein ein besserer Name für das Label gewesenouter
.while (true) {
...}
ist übertrieben. GOTO wird häufig wegen seiner missbräuchlichen Verwendung stigmatisiert, aber ich behaupte, dass unnötige Vergleiche mit booleschen Literalen schlechter sind als GOTO.continue LABEL;
Aussage sehr nützlich ist . So können Sie eine äußere liegende Schleife fortsetzen.http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html
quelle
Sie könnten also eines Tages verwendet werden, wenn die Sprachdesigner das Bedürfnis verspüren.
Wenn Programmierer aus Sprachen, die diese Schlüsselwörter haben (z. B. C, C ++), diese versehentlich verwenden, kann der Java-Compiler eine nützliche Fehlermeldung ausgeben.
Oder vielleicht war es nur, um Programmierer davon abzuhalten, goto zu verwenden :)
quelle
goto
undconst
spiegelt sein C / C ++ - Erbe wider, aber sie bleiben nicht implementiert (obwohl es Debatten über die Implementierung des letzteren gab). Ein paar mehr wieassert
undenum
waren anfangs nicht reserviert, sollten es aber vielleicht gewesen sein, da sie implementiert wurden. Aber im Nachhinein ist eine wunderbare Sache.Sie sind für die zukünftige Verwendung reserviert (siehe: Java Language Keywords )
Der Grund, warum es in Java keine goto-Anweisung gibt, finden Sie in " The Java Language Environment ":
quelle
goto
ist reserviert, aber nicht für zukünftige Verwendung.Ein Beispiel für die Verwendung von "continue" -Labels in Java ist:
Ergebnisse:
quelle
Es ist wichtig zu verstehen, dass das
goto
Konstrukt aus den Tagen stammt, als Programmierer in Maschinencode und Assemblersprache programmierten. Da diese Sprachen so einfach sind (wie in, jeder Befehl macht nur eine Sache), erfolgt der Programmsteuerungsfluss vollständig mitgoto
Anweisungen (in der Assemblersprache werden diese jedoch als Sprung oder Verzweigung bezeichnet ).Obwohl die C-Sprache relativ niedrig ist, kann sie als Assemblersprache auf sehr hoher Ebene betrachtet werden. Jede Anweisung und Funktion in C kann leicht in Assembler-Anweisungen unterteilt werden. Obwohl C heutzutage nicht die Hauptsprache zum Programmieren von Computern ist, wird es in Anwendungen auf niedriger Ebene wie eingebetteten Systemen immer noch häufig verwendet. Da die Funktion von C die Funktion der Assemblersprache so stark widerspiegelt, ist es nur sinnvoll, dass
goto
sie in C enthalten ist.Es ist klar, dass Java eine Weiterentwicklung von C / C ++ ist. Java hat viele Funktionen von C gemeinsam, abstrahiert jedoch viel mehr Details und ist daher einfach anders geschrieben. Java ist eine Sprache auf sehr hoher Ebene, daher ist es einfach nicht erforderlich, Funktionen auf niedriger Ebene zu haben, wie
goto
wenn Konstrukte auf höherer Ebene wie Funktionen für jede und während Schleifen den Programmsteuerungsfluss ausführen. Stellen Sie sich vor, Sie wären in einer Funktion und hättengoto
eine Beschriftung in eine andere Funktion übernommen. Was würde passieren, wenn die andere Funktion zurückgegeben würde? Diese Idee ist absurd.Dies beantwortet nicht unbedingt, warum Java die
goto
Anweisung enthält , sie jedoch nicht kompilieren lässt, aber es ist wichtig zu wissen, warum siegoto
überhaupt in Anwendungen auf niedrigerer Ebene verwendet wurde und warum es einfach keinen Sinn macht, sie zu verwenden in Java verwendet.quelle
Nein,
goto
wird nicht verwendet, aber Sie können Beschriftungen definieren und eine Schleife bis zur Beschriftung hinterlassen. Sie können das Etikett verwendenbreak
odercontinue
folgen. Sie können also mehr als eine Loop-Ebene herausspringen. Schauen Sie sich das Tutorial an .quelle
Nein, zum Glück gibt es nicht
goto
in Java.Das
goto
Schlüsselwort ist nur reserviert, wird aber nicht verwendet (dasselbe gilt fürconst
).quelle
Weil es nicht unterstützt wird und warum möchten Sie ein
goto
Schlüsselwort, das nichts getan hat, oder eine Variable mit dem Namengoto
?Obwohl Sie
break label;
undcontinue label;
Anweisungen verwenden können, um effektiv zu tun, wasgoto
tut. Aber ich würde es nicht empfehlen.quelle
The keywords const and goto are reserved, even though they are not currently used. This may allow a Java compiler to produce better error messages if these C++ keywords incorrectly appear in programs.
bedeutet dies "Wir verwenden es nicht. Wenn Sie also aus einem C ++ - Hintergrund stammen, lassen wir Sie es überhaupt nicht verwenden." 2)goto
ist ein schrecklicher Methodenname. Es tut uns leid. 3) Pause und Fortsetzung werden empfohlen, jedoch nicht in der hier verwendeten Weise . 4) "höchstwahrscheinlich" [Zitieren erforderlich].Nein,
goto
wird in Java nicht verwendet, obwohl es sich um ein reserviertes Wort handelt. Gleiches gilt fürconst
. Beide werden in C ++ verwendet, was wahrscheinlich der Grund ist, warum sie reserviert sind. Die Absicht war wahrscheinlich, zu vermeiden, dass C ++ - Programmierer, die auf Java migrieren, verwirrt werden, und möglicherweise auch die Option beizubehalten, sie in späteren Versionen von Java zu verwenden.quelle
goto
es in naher Zukunft nicht unterstützt wird;)Beachten Sie, dass Sie die meisten harmlosen Verwendungen von goto durch ersetzen können
Rückkehr
brechen
Etikett brechen
Wirf hinein, versuche es endlich
quelle
return
Wie bereits erwähnt, gibt es
goto
in Java kein Schlüsselwort, aber das Schlüsselwort wurde für den Fall reserviert, dass Sungoto
eines Tages Java hinzufügen möchte . Sie wollten es hinzufügen können, ohne zu viel Code zu beschädigen, deshalb haben sie das Schlüsselwort reserviert. Beachten Sie, dass sie mit Java 5 dasenum
Schlüsselwort hinzugefügt haben und es auch nicht so viel Code gebrochen hat.Obwohl Java keine hat
goto
, hat es einige Konstrukte, die einigen Verwendungen von entsprechengoto
, nämlich in der Lage zu seinbreak
undcontinue
mit benannten Schleifen. Auchfinally
kann als eine Art verdreht gedachtgoto
.quelle
Deklaration von gleichnamigen Variablen verbieten.
z.B
int i = 0, goto;
quelle
Es wird sehr oft als eines der Dinge angesehen, die Sie nicht tun, wurde aber wahrscheinlich als reserviertes Wort aufgeführt, um Verwirrung für Entwickler zu vermeiden.
quelle
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto
Wenn Ihnen gesagt wurde, dass es in Java keine goto-Anweisung gibt, wurden Sie getäuscht. In der Tat besteht Java aus zwei Schichten von 'Quellcode'.
quelle
Unter dem folgenden Link werden alle für Java reservierten Wörter angezeigt und es wird angegeben, welche Versionen hinzugefügt wurden.
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html
goto ist reserviert, obwohl es derzeit nicht verwendet wird, sag aber niemals nie :)
quelle
Ich bin auch kein Fan von
goto
Code, da dadurch Code normalerweise weniger lesbar wird. Ich glaube jedoch, dass es Ausnahmen von dieser Regel gibt (insbesondere wenn es um Lexer und Parser geht!)Natürlich können Sie Ihr Programm jederzeit in Kleene Normalform bringen, indem Sie es in etwas Assembler-ähnliches übersetzen und dann etwas Ähnliches schreiben
(Sie schreiben also im Grunde eine VM, die Ihren Binärcode ausführt ... wobei dies
line
dem Anweisungszeiger entspricht.)Das ist so viel besser lesbar als Code, der verwendet wird
goto
, nicht wahr?quelle
Natürlich ist es ein Schlüsselwort, aber es wird nicht auf der Ebene des Quellcodes verwendet.
Wenn Sie jedoch Jasmin oder eine andere niedrigere Sprache verwenden, die in Bytecode umgewandelt wird, ist "goto" vorhanden
quelle
Denn obwohl die Java-Sprache es nicht verwendet, tut es JVM-Bytecode.
quelle
load
Schlüsselwort?goto ist nicht in Java
Sie müssen GOTO verwenden, aber es funktioniert nicht richtig. In Java-Schlüsselwörtern wird es nicht verwendet. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
quelle