class Why
{
public static void main(String[]s)
{
String st2="A";
System.out.println(st2);
// String st4="MN3444\u000ar4t4";
System.out.println(st4);
}
}
请编译上面的代码,我在评论行中收到错误。
我无法理解编译器的这种行为, 这个错误意味着什么?
答案 0 :(得分:5)
在编译之前,每个Unicode字符都被其值替换,因为\u000a
代表新的行代码
// String st4="MN3444\u000ar4t4";
与此代码相同(请注意\u000a
之后的文字将移至新行,这意味着它将不再是评论的一部分)
// String st4="MN3444
r4t4";
您可以使用
进行测试//\u000a;System.out.println("hello comment");
等于
//
System.out.println("hello comment");
并将为您提供结果输出:hello comment
答案 1 :(得分:3)
如果我们查看\u000a
的ASCII表,我们会看到这是换行符。所以我认为编译器会在注释中替换ASCII转义的相应值。由于这是换行符,因此代码如下所示:
// String st4="MN3444
r4t4";
这就是为什么编译器说:“字符串文字没有被双引号正确关闭”。
因此,这也解释了为什么它适用于多行评论:
/ * String st4 =“MN3444 \ u000ar4t4”; * /
解析为:
/* String st4="MN3444
r4t4"; */
这是一个很好的评论。
行为已定义:JLS §3.2. Lexical Translations
原始Unicode字符流被转换为序列 令牌,使用以下三个词汇翻译步骤,即 依次申请:
Unicode原始流中的Unicode转义(第3.3节)的转换 字符到相应的Unicode字符。一个Unicode转义 形式\ uxxxx,其中xxxx是十六进制值,表示 UTF-16代码单元,其编码为xxxx。此转换步骤允许 任何只用ASCII字符表示的程序。
就像测试用例一样,编译很好:)
\u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0022\u0054\u0068\u0069\u0073\u0020\u0069\u0073\u0020\u0063\u006f\u006f\u006c\u0021\u0022\u0029\u003b