2010-10-25 2 views
9

Почему это скомпилировать в Java 6 (Sun 1.6.0_16):Проблема разбора unicode escape в Java 6 Строковый литерал ...?

System.out.println("\u000B"); 

... но не это:

System.out.println("\u000A"); 

На этой программе:

public class Test { 
    public static void main(String argv[]) { 
    System.out.println("\u000A"); 
    } 
} 

Я получаю a

Test.java:3: unclosed string literal 
System.out.println("\u000A"); 

Что тут происходит?

ответ

17

Проблема в том, что замена Unicode выполняется очень рано в процессе компиляции. Выделения Unicode не только действительны в строках и символьных литералах (как и другие управляющие последовательности, такие как \t) - они действительны в любом месте в коде. Они описаны в другой области спецификации - section 3.3, а не section 3.10.6; только последний составляет около символ и строковый литерал escape-последовательности.

В основном, прочитайте раздел 3 спецификации для получения более подробной информации о лексической структуре :)

Так что ваш код был фактически эквивалентно:

public class Test { 
    public static void main(String argv[]) { 
    System.out.println(" 
"); 
    } 
} 

... который явно не действует код. Для возврата каретки и подачи строки в основном лучше использовать escape-последовательности «\ r» и «\ n».

Лично я рассматриваю эту обработку Unicode вытекающее как недостаток в Java, но там не много мы можем сделать это сейчас :(

+1

Кто-то может поставить видео-учебник, как Академия Хана, на основе ответов Йона Скита. Уважение. –

+0

спасибо большое! – daf

3

ускользает Unicode расширены до лексического анализа. Тот факт, что побег Unicode появляется в строковый литерал не имеет значения. См JLS 3.2.

1

Это потому, что \ u000a = \ n и компилятор обрабатывает источник java, чтобы преобразовать его в токены, поэтому вы не можете использовать этот символ Юникода в своем коде. То же самое для \ u000d = \ г

1

Если я не ошибаюсь, чтобы избежать prepocessing мы могли бы решить эту проблему, изменив линию:

System.out.println((char)10); 

ограничение в том, что, будучи в CHAR, это расширение будет от 0 до 255.