2013-07-03 10 views
12

Quando utilizzo il carattere nullo '\u0000', il costruttore di stringhe interromperà l'aggiunta di nuovi elementi.Perché il costruttore di stringhe smette di aggiungere elementi dopo aver usato il carattere null?

Ad esempio:

StringBuilder _stringBuilder = new StringBuilder(); 
_stringBuilder.append('\u0000'); 
_stringBuilder.append('a'); 
System.out.println("."+_stringBuilder+"."); 

rendimenti

. 

ho capito che il valore null non deve essere stampato (o stampato come se fosse un valore String null), ma in questo caso, perché a stringbuilder non riescono ad aggiungere più elementi?

Nota: sto usando jdk 1.6.0_38 su ubuntu.

+0

'\ 0' - terminatore null, utilizzato come fine della stringa nelle stringhe C e C++ – user1516873

+1

Dubito che 'StringBuilder' abbia interrotto l'aggiunta di nuovi elementi. Questo è più probabilmente un problema nel mostrare la 'stringa' risultante. Qual è il 'length()' di 'StringBuilder' dopo aver aggiunto alcuni elementi? –

+1

Ho eseguito il tuo codice esatto in eclissi su jdk 1.6.0_25 su Win 7 e stampa '. a ... potrebbe essere una cosa specifica della shell. – FGreg

risposta

7

Il carattere null è un carattere riservato che indica la fine della stringa, quindi se si stampa qualcosa seguito da \u0000, nient'altro dopo verrà stampato.


Perché stringbuilder smette di aggiungere elementi dopo utilizzando il il carattere null? Non è proprio java, è il tuo terminale che considera \u0000 come la fine della stringa.

Come qualcuno dice, con Windows l'output può essere .a. (non l'ho testato), questo perché il terminale di Windows funziona in modo diverso rispetto al terminale di sistema basato su Unix. Sono abbastanza sicuro che se si esegue questo codice su una macchina OSX si otterrà lo stesso risultato di quello che si ottiene su linux

+2

Stampa un' .', una casella (per il carattere null), un 'a' e un' .' su dalla macchina di Windows. –

+0

@BheshGurung Penso che questo sia dovuto al fatto che i sistemi UNIX funzionano in modo diverso rispetto a Windows, in teoria se si prova la stessa cosa su OSX, dovrebbe stampare '.' – BackSlash

+2

Il carattere null non viene utilizzato per terminare le stringhe in Java. – Kayaman

7

tuo stringBuilder accoda ancora gli elementi, vedi:

StringBuilder stringBuilder = new StringBuilder(); 
stringBuilder.append('\u0000'); 
System.out.println(stringBuilder.length()); // prints 1 
stringBuilder.append('a'); 
System.out.println(stringBuilder.length()); // prints 2 

La mia ipotesi è che la tua console smette di stampare dopo il carattere di terminazione \u0000. Una console diversa potrebbe gestirlo in modo diverso.

1

Ho provato il test e non ha esito negativo in Eclipse sul mio sistema Windows 7. Tuttavia, l'esecuzione di questo programma di test distinguerà tra non accodamento e non stampa. Suggerisco di eseguirlo nell'ambiente in errore.

public class Test { 
    public static void main(String[] args){ 
    StringBuilder _stringBuilder = new StringBuilder(); 
    _stringBuilder.append('\u0000'); 
    _stringBuilder.append('a'); 
    System.out.println("."+_stringBuilder+"."); 
    System.out.println(_stringBuilder.length()); 
    System.out.println(_stringBuilder.charAt(1)); 
    } 
} 

Se il problema non è apposizione, la lunghezza sarà inferiore a 2, e il tentativo di stampare il carattere di indice 1 sarà sicuro. Se il problema è non stampabile, la lunghezza sarà 2 e il carattere nell'indice 1 sarà 'a'.

Penso che la non stampa sia molto più probabile che non in allegato.

Problemi correlati