Wann würde eine Null-Anweisung in Java verwendet?

10

In einem Lehrbuch, in dem ich nach einer Klasse gesucht habe, heißt es, dass eine Anweisung leer sein kann (die Null-Anweisung). Die Null-Anweisung ist nur als Semikolon definiert.

Es macht absolut nichts zur Ausführungszeit. Die Null-Anweisung wird selten verwendet.

Als mäßig erfahrener Programmierer finde ich es interessant, dass sie sagen , dass sie selten verwendet werden. Dies impliziert, dass es irgendwo eine Verwendung dafür gibt.

Was könnte eine solche Aussage möglicherweise gebrauchen?

Bassinator
quelle

Antworten:

7

Es ist meistens nutzlos, aber es gibt einige Stellen, an denen es notwendig ist. Zum Beispiel:

while (DoSomething());

Dadurch wird die DoSomething()Methode ausgeführt, bis false zurückgegeben wird. Dies setzt natürlich voraus, dass die Methode auch einige nützliche Nebenwirkungen hat. Die leere Anweisung, dh das nachfolgende Semikolon, ist jedoch erforderlich, andernfalls würde die while-Schleife stattdessen die nächste folgende Anweisung enthalten.

(Um den anderen Antworten zu widersprechen, for(;;) {}handelt es sich nicht um ein Beispiel für leere Anweisungen, da die Klammer nach einer for-Klausel keine Anweisungen enthält. Sie verwendet lediglich das Semikolon, um (optionale) Ausdrücke zu trennen. Weitere Informationen finden Sie in der Java-Grammatik .)

JacquesB
quelle
3
+1 - Dies ist das einzige Mal, dass ich gesehen habe, dass es wirklich verwendet wird (wie angegeben, sind leere Abschnitte einer 'for'-Anweisung etwas anders). Die einzige Änderung, die ich vornehmen würde, besteht darin, darauf hinzuweisen, dass es sehr verwirrend ist, diese Art der Verwendung zu lesen, wenn die Null-Anweisung in einer eigenen Zeile belassen wird und nicht unmittelbar nach der while-Schleife, wo sie nur wie eine gewöhnliche Anweisung aussieht Terminator ...
Jules
12

Sie können es verwenden, wenn eine Anweisung syntaktisch, aber nicht semantisch erforderlich ist. Der häufigste Fall ist, einen der Teile einer for-Schleife wegzulassen, wie in diesem Beispiel , obwohl die meisten Leute diese Verwendung als seltsam und schwer lesbar empfinden. Wie Ihr Buch sagt, wird es selten verwendet.

Karl Bielefeldt
quelle
Das. Ist eine nutzlose Sprachfunktion. Ich wäre lieber gezwungen, Duplikate explizit zu lesen, als "nur ein Semikolon Java" zu googeln.
Chris Cirefice
2
@ChrisCirefice Auf der anderen Seite "nur ein Semikolon: ist ziemlich offensichtlich, was es tun sollte, wenn man die Sprache nur mäßig kennt. Es ist keine separate Regel, es ist nur eine Folge anderer Regeln. Und wenn man sie lernt, sobald man sie für immer kennt, Also würde ich sagen, es ist nicht wirklich ein Problem.
Maurycy
1
Wenn Sie das Gefühl haben, solche Loops zu schreiben, machen Sie etwas falsch.
Bassinator
Ich habe eine Schlafabfragemethode, mit der ich überprüfe, wann ein Gerät wieder online geht. Der Code sieht so ziemlich so aus: while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }natürlich alle in getrennten Zeilen. Ich hätte es so schreiben können while ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }, aber das wäre falsch.
BobDalgleish
Es ist keine Null-Anweisung, die wir auch verwenden, um einen Ausstieg aus 'void'-Methoden zu erzwingen. void method(){ //code here. If(condition){return ;}}.
Laiv
9

Ich bevorzuge die Verwendung einer while-Schleife , aber mit einem Null-Ausdruck können Sie Folgendes schreiben:

for (;;) { thread.run(); }

Mit einer Null-Anweisung können Sie jedoch Folgendes schreiben:

while(true);
{
    thread.run();
}

Der Hauptzweck davon ist es, die Zeit des armen Wartungsprogrammierers zu verschwenden, der nach Ihnen kommt und sich fragt, warum der Thread nicht läuft. Eine Aussage muss eine Weile folgen. Ein einsamer; ist eine Aussage. Dieser Anweisungsblock ist also nicht Teil der Schleife.

Das heißt nicht, dass es keine guten Verwendungszwecke gibt. Sie sind nur selten. Sie sehen normalerweise so aus:

{
    ;
}

Weil es so aussieht, als ob Sie das vorhaben (auch das reicht manchmal nicht aus).

In der Assembly wird diese Null-Anweisung als NOP bezeichnet . In Python heißt es Pass . In Java (und den anderen Kindern von c) ist es ein Semikolon, wie Sie gesagt haben, oder sogar wahr zu behaupten;

Ich kenne einige Verwendungszwecke:

Semantik .

Es gibt einen Unterschied zwischen einem leeren Raum und dem Setzen einer Null als Antwort. Es steht klar, nein, ich habe nicht vergessen, hier etwas zu platzieren. Dieses Nichts soll nichts sein. Es ist explizit nichts. Dieser Raum wurde absichtlich leer gelassen. Auf diese Weise erhalten wir N / A zum Kompilieren.

Das Nullmuster

Stellen Sie sich eine komplizierte und teure Lichtsignalmaschine vor, die wiederholt eine farbige Glühbirne von einem Förderband aufnahm, sie in eine Fassung schraubte, einschaltete, entfernte und die nächste aufnahm. Sie können steuern, was dieses Ding durch die Farbe der Glühbirnen signalisiert, die Sie auf den Gürtel gelegt haben. Großartig, jetzt, da es endlich einwandfrei funktioniert, möchte Ihr Chef, dass Sie einen Weg finden, um das Timing dieser Signale zu steuern. Er möchte eine Lücke zwischen Nachrichten hinzufügen. Sie erinnern sich mit Entsetzen daran, dass sich viele Teile um das Timing dieser Signale kümmern und wie schmerzhaft es war, sie synchron zu halten. Wie können Sie das Timing kontrollieren, ohne dass Sie über das Wochenende bei der Arbeit bleiben? Sie schauen zu einem Behälter mit ausgebrannten Glühbirnen und bekommen eine, nicht wörtlich, gute Idee.

Manchmal möchten Sie Polymorphismus verwenden, um einfach etwas auszuschalten, ohne etwas zu beschädigen.

Debuggen

Wenn Sie einen Haltepunkt festlegen, muss ein Platz für den Haltepunkt vorhanden sein. Nun sicher, einige Debugger lassen Sie es auf die schließende geschweifte Klammer setzen, aber wenn sie es nicht tun, ist es schön, dass die Sprache Sie zwingen lässt, dass es einen Platz gibt, an dem Sie einen platzieren können, selbst wenn dieser Ort nichts tut.

Nicht wirklich eine Java-Sache, aber es gibt auch:

Binäres Geigen

Assemblies Der NOP-Befehl ermöglicht das Fummeln mit der kompilierten ausführbaren Binärdatei. Aber moderne Java-Compiler optimieren so viel, dass ich nicht sicher bin, ob das Semikolon nicht nur schlecht ist. Früher haben wir diese leeren Stellen in der ausführbaren Datei aber auch verwendet, um das Timing zu steuern oder um später einen Haken zu setzen. Ohne das NOP gäbe es dort tatsächliche Anweisungen. Wenn Sie also einbinden möchten, müssen Sie diese Anweisungen an eine andere Stelle kopieren, um Platz für den Haken zu schaffen. Dies funktioniert genauso gut in der c-Sprache, aus der Java einen Großteil seiner Syntax bezieht. Aber ich glaube nicht, dass dieses Hook-Fiddling in Java häufig vorkommt. Dazu verwenden wir die aspektorientierte Programmierung .

candied_orange
quelle
2
Dies mag pedantisch erscheinen, aber das Beispiel mit forist keine Null-Anweisung. Nullanweisungen (auch leere Anweisungen genannt) können an derselben Stelle ifauftreten, an der andere Anweisungen (wie eine ) auftreten können. Die folgenden Klammern forerlauben jedoch keine Anweisungen zwischen den Semikolons, sondern nur einen Initialisierer und zwei Ausdrücke, die optional sind. Es ist also eine andere Verwendung von Semikolon als als Statment-Terminator. Eine leere Aussage wäre das letzte Semikolon infor(;;);
JacquesB
Du hast recht, das scheint pedantisch: P. Gut, bitte beachten Sie meine Bearbeitung.
candied_orange
-7

Ich benutze es, weil Java so gestaltet ist, dass es nicht mit der menschlichen Sprache übereinstimmt. Gleiches gilt für C.

Eine Aussage ist statement;.

Eine if-then-else-Anweisung lautet if (condition) statement; else statement;

Eine if-then-else-Anweisung mit zusammengesetzten Blöcken lautet if (condition) {statements} else {statements}

Das ist eindeutig Unsinn.

Ich schreibe dementsprechend, if (condition) {statements} else {statements};was logisch und vernünftig ist.

Wenn die Entwickler von Java dies als Wenn-Dann-Sonst gefolgt von einer Null-Anweisung behandeln möchten, bin ich damit einverstanden. Wenn es sie glücklich macht, lass es sie glücklich machen.

Martin Kochanski
quelle
Es ist if (condition) {statements;} else {statements;}. Außerdem ist Java ziemlich konsistent, wenn es darum geht, kein ;s danach zu benötigen }. So ähnlich wie menschliche Sprachen nicht oft einen Punkt am Ende eines Satzes einfügen, der bereits mit einem Fragezeichen abgeschlossen ist. (Sicher, es gibt die !?oder ?!Endungen, aber das sind nur Annäherungen an den Interrobang-Charakter .)
8bittree
1
Süßer Gott !! o_O
Áxel Costas Pena