Quando verrà utilizzata un'istruzione null in Java?


10

In un libro di testo che ho cercato per una classe, si afferma, un'istruzione può essere vuota (l'istruzione null). L'istruzione null è definita come solo un punto e virgola.

Non fa assolutamente nulla al momento dell'esecuzione. L'istruzione null viene utilizzata raramente.

Come programmatore moderatamente esperto, trovo interessante il fatto che si dice che venga usato raramente , è questo implica che da qualche parte, c'è un uso per questo.

Quale potrebbe essere l'uso di tale affermazione?

Risposte:


7

È per lo più inutile, ma ci sono alcuni posti dove è necessario. Per esempio:

while (DoSomething());

Questo esegue il DoSomething()metodo fino a quando non restituisce false. Ovviamente ciò presuppone che il metodo comporti anche alcuni effetti collaterali utili. Ma è richiesta l'istruzione vuota, ovvero il punto e virgola finale, altrimenti il ​​ciclo while includerà invece la seguente istruzione successiva.

(Ma per contraddire le altre risposte, nonfor(;;) {} è un esempio di affermazioni vuote, poiché la parentesi dopo una clausola for non contiene istruzioni, usa solo il punto e virgola per separare le espressioni (facoltative). Vedi la grammatica Java per i dettagli.)


3
+1: questa è l'unica volta che l'ho mai visto davvero usato (come detto, le sezioni vuote di un'istruzione 'for' sono leggermente diverse). L'unica modifica che farei è sottolineare che è molto confuso leggere questo tipo di utilizzo se l'istruzione null viene lasciata sulla propria riga, piuttosto che immediatamente dopo il ciclo while, dove sembra solo un'istruzione normale terminatore ...
Jules

12

Puoi usarlo quando un'istruzione è sintatticamente richiesta ma non semanticamente richiesta. Il caso più comune è quello di omettere una delle parti di un ciclo for, come questo esempio , anche se la maggior parte delle persone trova quell'uso strano e difficile da leggere. Come dice il tuo libro, viene usato raramente.


Quello. È una funzione linguistica inutile. Preferirei essere costretto a leggere esplicitamente la duplicazione piuttosto che a Google "solo un punto e virgola java".
Chris Cirefice,

2
@ChrisCirefice D'altra parte "solo un punto e virgola: è abbastanza ovvio cosa dovrebbe fare considerando che conosci la lingua con moderazione. Non è una regola separata, è solo una conseguenza di altre regole. Inoltre se la impari una volta che la conosci per sempre, quindi direi che non è davvero un problema.
Maurycy,

1
Se ti senti come se stessi scrivendo loop in quel modo, stai facendo qualcosa di sbagliato.
Bassinator

Ho un metodo di polling del sonno che uso per controllare quando un dispositivo torna in linea. Il codice è praticamente simile a questo: while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }ovviamente tutto su righe separate. Avrei potuto scriverlo come while ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }, ma sarebbe sbagliato.
BobDalgleish,

Non è un'istruzione nulla ciò che usiamo anche per forzare un'uscita dai metodi "vuoti"? void method(){ //code here. If(condition){return ;}}.
Laiv

9

Preferisco usare un ciclo while , ma un'espressione nulla ti consente di scrivere questo:

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

Tuttavia, un'istruzione null ti consente di scrivere questo:

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

Lo scopo principale è quello di perdere il tempo del programmatore di scarsa manutenzione che ti segue e si chiede perché il thread non sia in esecuzione. Una dichiarazione deve seguire un po '. Solo ; è una dichiarazione. Quindi questo blocco di istruzioni in realtà non fa parte del ciclo.

Ciò non significa che non ci siano buoni usi. Sono solo rari. Di solito sembrano così:

{
    ;
}

Perché in questo modo sembra che tu intenda farlo (anche questo a volte non è abbastanza).

Nell'assemblaggio questa dichiarazione nulla è chiamata NOP . In Python si chiama pass . In java (e gli altri figli di c) è un punto e virgola come hai detto, o addirittura affermare vero;

Conosco alcuni usi:

Semantico .

C'è una differenza tra uno spazio vuoto e lo zero verso il basso come risposta. Dice chiaramente, no, non ho dimenticato di mettere qualcosa qui. Questo niente è pensato per essere niente. Non è esplicito nulla. Questo spazio è stato lasciato intenzionalmente in bianco. Ecco come otteniamo la compilazione di N / A.

Il modello nullo

Immagina una complicata e costosa macchina per la segnalazione della luce che raccoglie ripetutamente una lampadina colorata da un nastro trasportatore, la avvita in una presa, la accende, la rimuove e raccoglie la successiva. Potresti controllare ciò che questa cosa ha segnalato dal colore delle lampadine che hai messo sulla cintura. Fantastico, ora che finalmente funziona alla perfezione il tuo capo vuole che tu crei un modo per controllare i tempi di questi segnali. Vuole aggiungere un divario tra i messaggi. Ricordi con orrore che molte parti hanno a cuore i tempi di questi segnali e che dolore è stato sincronizzarli. Come hai intenzione di controllare i tempi senza che questo ti mantenga al lavoro durante il fine settimana? Dai un'occhiata a un cestino di lampadine bruciate e ottieni un'idea brillante, non letteralmente brillante.

A volte vuoi usare il polimorfismo per spegnere qualcosa senza rompere nulla.

Debug

Quando si imposta un punto di interruzione, è necessario che ci sia un posto per il punto di interruzione. Ora certo alcuni debugger ti permetteranno di impostarlo sulla parentesi graffa di chiusura ma se non lo fanno è bello che la lingua ti permetta di forzare un posto dove metterne uno anche se quel posto non fa nulla.

Non proprio una cosa java ma c'è anche:

Fiddling binario

L'istruzione NOP degli assiemi consente di armeggiare con l'eseguibile binario compilato. Ma i moderni compilatori Java ottimizzano così tanto che non sono sicuro che il punto e virgola non vada semplicemente male. Ma ai vecchi tempi usavamo anche questi punti vuoti nell'eseguibile per controllare i tempi o permetterci di lasciarci andare in un secondo momento. Senza il NOP ci sarebbero delle istruzioni reali lì, quindi se volessi agganciare dovresti copiare quelle istruzioni da qualche altra parte per fare spazio al gancio. Funziona altrettanto bene nel linguaggio c da cui Java ottiene gran parte della sua sintassi. Ma non credo che questo giocherellamento con l'amo avvenga molto in Java. Per farlo utilizziamo la programmazione orientata agli aspetti .


2
Questo potrebbe sembrare pedante, ma l'esempio con fornon è dichiarazioni null. Le istruzioni Null (ovvero le istruzioni vuote) possono verificarsi nello stesso posto in cui possono verificarsi altre istruzioni (come un if), ma le parentesi che seguono fornon consentono le istruzioni tra i punti e virgola, ma solo un inizializzatore e due espressioni, che risultano opzionali. Quindi è un uso diverso del punto e virgola rispetto a come terminatore di statment. Una dichiarazione vuota sarebbe l'ultimo punto e virgola infor(;;);
Jacques B

Hai ragione, questo sembra pedante: P. Bene, per favore nota la mia modifica.
candied_orange,

-7

Lo uso perché Java è progettato in un modo non conforme al linguaggio umano. Lo stesso vale per C.

Una dichiarazione è statement;.

Un'istruzione if-then-else è if (condition) statement; else statement;

È un'istruzione if-then-else con blocchi composti if (condition) {statements} else {statements}

Questa è chiaramente una sciocchezza.

Scrivo di conseguenza if (condition) {statements} else {statements};che è logico e ragionevole.

Se i progettisti di Java vogliono considerare questo come if-then-else seguito da un'istruzione null, sto bene. Se li rende felici, lasciali felici.


Lo è if (condition) {statements;} else {statements;}. Inoltre, Java è abbastanza coerente nel non aver bisogno di ;s dopo }. Un po 'come le lingue umane non attaccano spesso un punto alla fine di una frase che è già terminata con un punto interrogativo. (Certo, ci sono i !?o ?!terminazioni, ma quelli sono solo approssimazioni , il carattere interrobang .)
8bittree

1
Dio dolce !! o_O
Áxel Costas Pena,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.