Hat Java erkennen Endlosschleifen?
Angesichts des folgenden code-Beispiel:
public class WeirdStuff {
public static int doSomething() {
while(true);
}
public static void main(String[] args) {
doSomething();
}
}
Dies ist eine gültige Java-Programm, obwohl die Methode doSomething() sollte int zurückgeben, aber es nie tut. Wenn Sie es ausführen, wird es am Ende in einer Endlosschleife. Wenn man das argument der while-Schleife in eine separate variable (z.B. boolean bool = true) der compiler wird Ihnen sagen, int zurückgeben, die in dieser Methode.
Also meine Frage ist: ist diese irgendwo in der Java-Spezifikation und gibt es situation, wo dieses Verhalten nützlich sein?
- Würden Sie nicht brauchen eine
return 0;
(oder gleichwertig) nachwhile(true);
, einfach, um den compiler glücklich? Ich weiß, ich habe Java-Sie beschweren sich, dass Methoden nicht wieder den richtigen Typ vor. ... , Dass gesagt wird, ich kann Total sehen, dass ein Programm kompilieren. - Sehr interessant... ich war überrascht, dass es tatsächlich kompiliert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich zitiere die Java Language Specification, als es ziemlich klar: die
...
...
Dann gelten die oben genannten Definitionen zu diese:
Java-Spezifikation definiert das Konzept der sogenannten Unreachable statements. Sie sind nicht erlaubt, eine nicht-erreichbar-Anweisung in Ihrem code (es ist eine compile-Zeit-Fehler). Ein
while(true);
- Anweisung bewirkt, dass die folgenden Aussagen nicht erreichbar-per definition. Sie sind nicht einmal erlaubt, einreturn
Anweisung nach derwhile(true);
- Anweisung in Java. Beachten Sie, dass während Halteproblem ist unentscheidbaren im generischen Fall, die definition des nicht-erreichbar-Aussage ist strenger als nur gestoppt. Es ist die Entscheidung ganz bestimmten Fällen, wo ein Programm definitiv nicht halt. Der compiler theoretisch nicht in der Lage zu erkennen alle unendlichen Schleifen und unerreichbar Aussagen, aber es ist zu erkennen, bestimmte Fälle definiert, in der spec.while(true)
ist nicht nicht erreichbar (klar!). Jede Aussage, die Folgen würdewhile(true)
ist nicht erreichbar.while(true);
kompiliert einwandfrei, aberwhile (true); return 0;
nicht.bool x = true; while(x);
), würde der compiler prüfen, verlassen der Schleife einen möglichen "code-Pfad" und würde Sie schreiben einreturn
Aussage. Ansonsten wäre es nicht kompilieren ohnereturn
.Wenn Sie sich Fragen, wenn unendliche Schleifen nützlich sein kann, die Antwort ist ja. Es gibt viele Situationen, in denen Sie wollen, dass etwas läuft ewig, obwohl die Schleife wird in der Regel gekündigt werden, irgendwann.
Als auf Ihre Frage: "Kann java erkannt, wenn eine Schleife wird unendlich sein?" Die Antwort ist, dass es unmöglich ist, für einen computer, um einen Algorithmus, um zu bestimmen, ob ein Programm ausgeführt werden kann für immer oder nicht. Lesen Sie über: Halteproblem
Lesen ein bisschen mehr, deine Frage ist auch zu Fragen, warum die doSomething () - Funktion nicht beschweren, dass es nicht wieder ein int.
Interessanterweise ist der folgende source NICHT kompilieren.
Dies zeigt mir, dass, als die wiki-Seite auf das Halteproblem schon sagt, ist es unmöglich, für die es einen Algorithmus, um zu bestimmen, ob jedes problem beendet, aber das bedeutet nicht, jemand hat Sie nicht der einfache Fall:
dem java spec. Mein Beispiel oben ist ein wenig komplizierter, so dass Java nicht haben, können es vergessen, als eine unendliche Schleife. Wahrlich, dies ist eine seltsame edge-Fall, aber es gibt halt Dinge zu machen kompilieren. Vielleicht wird jemand versuchen, andere Kombinationen.
BEARBEITEN: kein Problem mit nicht erreichbaren code.
Den oben genannten arbeiten, so dass die while(true); wird nicht vom compiler ignoriert, da nicht erreichbar, sonst würde es werfen einen compile-Zeit-Fehler!
while (true);
ohnebreak
odergoto
- Anweisung wird eine Endlosschleife kann überprüft werden, indem der compiler.Ja, man kann diese "unendliche" Schleifen in einigen threads, zum Beispiel server-threads, die hören auf einen bestimmten port für eingehende Nachrichten.
Das Programm legal ist Java nach der Spezifikation. Die JLS (und Java-compiler) zu erkennen, dass die Methode nicht zurückkehren können, und daher keine
return
- Anweisung erforderlich ist. In der Tat, wenn Sie einenreturn
Anweisung nach der Schleife wird der Java-compiler würde Ihnen einen Kompilierungsfehler, da der return-Anweisung wäre unreachable code.Denke ich nicht so, außer vielleicht in obskuren unit-tests.
Ich gelegentlich auch Methoden schreiben, die niemals zurückkehren wird (normalerweise), sondern setzen den aktuellen thread in eine Unterbrechungsfreie unendliche busy-loop nur selten einen Sinn macht.
Nach Wiederlesen die Frage....
Java versteht while(true); kann eigentlich nie abgeschlossen, es tut nicht nachvollziehen, den folgenden code komplett.
Ist das nützlich? Zweifelhaft.
Könnten Sie die Implementierung einer Allgemeinen Schnittstelle, so dass, obwohl die Methode kann beendet mit einem sinnvollen Wert zurückgeben, Ihre besonderen Umsetzung ist eine nützliche Endlosschleife (beispielsweise einem Netzwerk-server), die nie eine situation, wo es sollte beendet werden, d.h. auslösen, was auch immer Aktion gibt einen Wert zurück, bedeutet.
Auch in Bezug auf code wie
boolean x = true; while (x);
diese wird kompilieren gegebenfinal
Modifikator aufx
. Ich weiß nicht, offhand, aber ich könnte mir vorstellen, dieser ist Java die Wahl der angemessenen einfache Konstanten Ausdrucks-Analyse (was definiert werden muss einfach da, aufgrund dieser Ablehnung der Programme abhängig sind, ist es ein Teil der Sprache, definition).Einige Notizen über die nicht-erreichbar-Aussagen:
In java2-Spezifikationen die Beschreibung von "unreachable statement" gefunden werden konnte. Besonders interessant ist der folgende Satz:
So, es ist nicht möglich zu verlassen
while (true);
Endlosschleife. Allerdings gab es zwei weitere Optionen: ändern Sie die zwischengespeicherten Werte oder hack direkt in die class-Datei oder JVM operating Speicherplatz.