为什么java编译器要在实际编译之前剥离所有unicode字符?

为什么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

我对Java非常陌生,我有如下代码:

    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时 这是一个换行符,代码更改如下:

关于这一点,我有两个问题:

  • 为什么Java首先解析unicode?这有什么好处吗
  • 因为这行仍然有注释,Java正在尝试解析它!这是唯一的情况吗?或者它通常也会解析注释行吗?我很困惑
  • 提前谢谢

  • 为什么Java首先解析unicode?它有什么好处吗
  • 是的,在编译器进行词典分析之前,首先替换unicode序列

    引述:

    Java编程语言的编译器(“Java编译器”)首先识别其输入中的Unicode转义,将ASCII字符\u后跟四个十六进制数字转换为所示十六进制值的UTF-16代码单元(§3.1),并传递所有其他字符不变

    例如,以下源代码导致错误:

    // 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正在尝试解析它!这是唯一的情况吗?或者它通常也会解析注释行?我很困惑

  • Java编译器不分析注释,但仍然需要对注释进行解析,才能知道注释的结尾。

    问题2不清楚您在问什么。很明显,最后的代码片段将不会编译。您已经回答了第二个问题:)Java不会解析注释,但在预处理后,javac会看到两行,第一行是注释,第二行是
    ,这是一个语法错误。问题1的答案是:否则它什么时候会进行Unicode翻译?@OliverCharlesworth我个人认为lexer会跳过注释中的所有标记。在我看来,在实际编译之前进行这种处理是不合逻辑的。有什么好处?@ZouZou:为了一致性。Unicode翻译只是编译器要做的第一件事(请参阅)。