2010-10-25 27 views
9

Tại sao điều này biên dịch trong java 6 (Sun 1.6.0_16):Sự cố phân tích cú pháp thoát Unicode trong chuỗi 6 chuỗi Java ...?

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

... nhưng không này:

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

Mở chương trình này:

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

tôi nhận được a

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

Những gì đang xảy ra ở đây?

Trả lời

17

Vấn đề là việc thay thế Unicode được thực hiện rất sớm trong quá trình biên dịch. Việc thoát Unicode không chỉ hợp lệ trong chuỗi ký tự và các ký tự chữ (như các chuỗi thoát khác chẳng hạn như \t) - chúng hợp lệ ở bất kỳ nơi nào trong mã. Chúng được mô tả trong một khu vực khác của spec - section 3.3 thay vì section 3.10.6; chỉ cái sau là khoảng ký tự và chuỗi ký tự ẩn thoát.

Về cơ bản, đọc phần 3 của spec để biết thêm chi tiết về cấu trúc từ vựng :)

Vì vậy, mã của bạn được thực tương đương với:

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

... mà rõ ràng là không hợp lệ mã. Đối với dòng trả về và dòng thức ăn, về cơ bản tốt nhất là sử dụng chuỗi thoát "\ r" và "\ n".

Cá nhân tôi xem việc xử lý này của Unicode thoát như một lỗ hổng trong Java, nhưng không có nhiều thứ chúng ta có thể làm gì về nó bây giờ :(

+1

Ai đó có thể đưa lên video hướng dẫn nối tiếp như Khan Academy dựa trên câu trả lời của Jon Skeet. Sự tôn trọng. –

+0

cảm ơn rất nhiều! – daf

3

thoát Unicode được mở rộng trước khi phân tích từ vựng. Thực tế là thoát Unicode xuất hiện trong một chuỗi chữ là không thích hợp. Xem JLS 3.2.

1

đó là do \ u000a = \ n và trình biên dịch xử lý nguồn java để chuyển đổi nó thành mã thông báo, vì vậy bạn không thể sử dụng ký tự unicode đó trong mã của mình. Điều này cũng cho \ u000d = \ r

1

Nếu tôi không nhầm, để tránh prepocessing chúng ta có thể giải quyết nó bằng cách thay đổi dòng trong:

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

Hạn chế được rằng bằng cách trở thành một CHAR, đó là mở rộng sẽ từ 0 đến 255.

Các vấn đề liên quan