2012-10-29 14 views
5

Nell'ultima edizione di JavaSpecialists newsletter, l'autore parla di un pezzo di codice che è un-compilabile in JavaPerché alcuni caratteri letterali dei caratteri causano errori di sintassi in Java?

public class A1 { 
    Character aChar = '\u000d'; 
} 

Prova compilarlo, e si otterrà un errore, come ad esempio:

A1.java:2: illegal line end in character literal 
       Character aChar = '\u000d'; 
           ^

Perché un pezzo equivalente di codice C# non mostra un problema simile?

public class CharacterFixture 
{ 
    char aChar = '\u000d'; 
} 

Mi manca qualcosa?

EDIT: La mia intenzione originale di domanda era come il compilatore C# ha ottenuto l'analisi dei file unicode corretta (se è così) e perché java dovrebbe continuare con l'analisi errata (se così)? EDIT: Anche io voglio che il titolo della mia domanda originale sia ripristinato? Perché un montaggio così pesante e ho il forte sospetto che abbia pesantemente modificato le mie intenzioni.

+0

Haha. Tu eccetto Java per cambiare? Avevo bisogno di quella risata :) –

+2

È possibile ripristinare il titolo originale (fare clic sul collegamento "X tempo fa modificato" per vedere le revisioni). Tuttavia, il titolo originale era soggettivo e polemico per confrontare il "modo" di Java e il "modo" di C#. Sono lingue diverse con specifiche differenti. –

+0

@pst - ma con questo titolo, non avrei dovuto porre la domanda perché la stessa newsletter fornisce una spiegazione sufficiente. Rispetto le modifiche e non sono costretto a ripristinarlo. La mia intenzione era il perché la differenza in questo contesto tra due compilatori simili. – suhair

risposta

12

Il compilatore di Java traduce le sequenze di escape \uxxxx come uno dei primi passi, anche prima che il tokenizer ottenga una crepa sul codice. Nel momento in cui inizia effettivamente la tokenizzazione, non ci sono più sequenze \uxxxx; sono già trasformati in caratteri che rappresentano, quindi al compilatore il tuo esempio Java ha lo stesso aspetto che se avessi effettivamente digitato un ritorno a capo in qualche modo. Lo fa per fornire un modo per utilizzare Unicode all'interno del codice sorgente, indipendentemente dalla codifica del file sorgente. Anche il testo ASCII può ancora rappresentare pienamente i caratteri Unicode se necessario (a scapito della leggibilità), e poiché è fatto così presto, puoi averli quasi ovunque nel codice. (Si potrebbe dire \u0063\u006c\u0061\u0073\u0073\u0020\u0053\u0074\u0075\u0066\u0066\u0020\u007b\u007d, e il compilatore lo leggerà come class Stuff {}, se si voleva essere noioso o torturarsi.)

C# non lo fa. \uxxxx viene tradotto in seguito, con il resto del programma, ed è valido solo in determinati tipi di token (vale a dire identificatori e stringhe/caratteri letterali). Ciò significa che non può essere utilizzato in determinati luoghi in cui può essere utilizzato in Java. cl\u0061ss non è una parola chiave, ad esempio.

+0

Puoi approfondire "successivamente", "alcuni tipi di token", "determinati luoghi"? – Vic

+1

@Vic: "Più tardi" è più chiaro di quanto io possa farcela, e "certi luoghi" sono arrivati ​​anche con un esempio. Ho aggiunto dei chiarimenti per "alcuni tipi di token". – cHao

Problemi correlati