Java中无效字符文本的查询

Java中无效字符文本的查询,java,Java,我了解到,以下四行中的字符文字无效 char ch1 = '\u000a'; //Line feed char ch2 = '\u000d'; //Carriage return char ch3 = '\u0027'; // ' character char ch4 = '\u005C'; // \ character 我的问题: 我想理解,为什么这些字符文本是无效的?这并不是因为它们是无效的,真正发生的是源解析器在开始解析代码的词法标记之前转换所有的\uxxx;例如,如果您有类似于char

我了解到,以下四行中的字符文字无效

char ch1 = '\u000a'; //Line feed
char ch2 = '\u000d'; //Carriage return
char ch3 = '\u0027'; // ' character
char ch4 = '\u005C'; // \ character
我的问题:


我想理解,为什么这些字符文本是无效的?

这并不是因为它们是无效的,真正发生的是源解析器在开始解析代码的词法标记之前转换所有的
\uxxx
;例如,如果您有类似于
charch1='\u000a'//换行
解析器将您的源代码转换为如下内容:

char ch1 = '
'; //Line feed
char ch1 = ''; //Line feed  
//will be compiled as 
char ch1 = '
';

char ch2 = '\u000d'; //Carriage return
//will be compiled as
'char ch2= ';

char ch3 = '''; // ' character
//will be compiled as 
char ch3=''';

char ch4 = '\u005C'; // \ character
//will be compiled as
char ch4='\';
这是一个语法错误

作为练习,请执行以下操作:

System.out.println("Hola mundo\u0022);
它将被编译,因为
\u0022
是双引号,所以上面的代码被转换为:

System.out.println("Hola mundo");

因为这些文字实际上是在编译时之前翻译的(无论是字符文字还是字符串);因此,第一个示例给出:

char ch1 = '
';
这是无效的语法

但这在字符串中不是问题。你可以写:

String s = "\u000a";
自:

String s = "
";

是有效语法。

换行意味着向前移动一行。代码是\n。回车意味着将光标移动到行首。代码是\r\n

Unicode转义是在编译器运行之前预处理的。因此,如果将\u000A放入如下字符串文字:

char ch1 = '
'; //Line feed
char ch1 = ''; //Line feed  
//will be compiled as 
char ch1 = '
';

char ch2 = '\u000d'; //Carriage return
//will be compiled as
'char ch2= ';

char ch3 = '''; // ' character
//will be compiled as 
char ch3=''';

char ch4 = '\u005C'; // \ character
//will be compiled as
char ch4='\';

因此,这些在编译时都是错误的

所以在编译时之前,这一行[char ch='\u00A5';]将变成[char ch='¥';]?@fge尝试编译(
String s=“\u000a”
),它不会t@overexchange事实上,请参阅第3.2节了解更多详细信息。根据3.2 JLS,解析分3个阶段完成,第一阶段,[char ch='\u00A5';]将成为[char ch='¥';]?@过度交换被授予,不完全是2次而是不止一次,并且\uxxx将首先被处理。是的,您的源代码
char ch='\u00A5';
将成为
char ch='¥';