为什么java编译器要在实际编译之前剥离所有unicode字符?
我对Java非常陌生,我有如下代码:为什么java编译器要在实际编译之前剥离所有unicode字符?,java,parsing,unicode,Java,Parsing,Unicode,我对Java非常陌生,我有如下代码: public class Puzzle { public static void main(String... args) { System.out.println("Hi Guys!"); // Character myChar = new Character('\u000d'); } } /*String s=" ";*/ 您可以看到以下行: Character
public class Puzzle {
public static void main(String... args) {
System.out.println("Hi Guys!");
// Character myChar = new Character('\u000d');
}
}
/*String s="
";*/
您可以看到以下行:
Character myChar = new Character('\u000d');
被注释掉了。但是,当我运行javac
时,仍然会出现这样的错误:
Puzzle.java:9: error: unclosed character literal
// Character myChar = new Character('\u000d');
^
1 error
在这篇文章中,我找到了异常的原因。博客上说:
Java编译器,就在实际编译去掉所有
unicode字符并将其转换为字符形式。这个解析是
完成了完整的源代码,其中还包括注释。
转换完成后,Java编译过程开始
继续
在我们的代码中,当Java编译器遇到\u000d时
这是一个换行符,代码更改如下:
关于这一点,我有两个问题:
// String s = "\u000d";
但这一条是有效的:
/*String s = "\u000d";*/
因为当用新行替换\u000d
时,它将如下所示:
public class Puzzle {
public static void main(String... args) {
System.out.println("Hi Guys!");
// Character myChar = new Character('\u000d');
}
}
/*String s="
";*/
使用多行注释/***/
完全可以
此外,还包括以下代码:
public static void main(String[] args) {
// Comment.\u000d System.out.println("I will be printed out");
// Comment.\u000a System.out.println("Me too.");
}
将打印:
I will be printed out
Me too.
因为在unicode替换之后,System.out.println()
语句将在注释部分之外
回答您的问题:unicode的替换必须在某个时候进行。有人可能会说,这应该发生在发表评论之前或之后。在发表评论之前,我们选择了这样做
Reasonig可能是因为注释只是另一个词汇元素,在识别和分析词汇元素之前,您通常希望替换unicode序列
请参见此示例:
/\u002f This is a comment line
如果放置在Java源代码中,则不会导致编译错误,因为\u002f
将被翻译为字符'/'
,并且与前面的'/'
一起将形成行注释的开头/
Java编译器不分析注释,但仍然需要对注释进行解析,才能知道注释的结尾。问题2不清楚您在问什么。很明显,最后的代码片段将不会编译。您已经回答了第二个问题:)Java不会解析注释,但在预处理后,javac会看到两行,第一行是注释,第二行是
)
,这是一个语法错误。问题1的答案是:否则它什么时候会进行Unicode翻译?@OliverCharlesworth我个人认为lexer会跳过注释中的所有标记。在我看来,在实际编译之前进行这种处理是不合逻辑的。有什么好处?@ZouZou:为了一致性。Unicode翻译只是编译器要做的第一件事(请参阅)。