当前位置: 首页 > 知识库问答 >
问题:

为什么一些字符文字会导致Java中的语法错误?

韩高峯
2023-03-14

在最新版本的JavaSpecialists时事通讯中,作者提到了一段在Java中不可编译的代码

public class A1 {
  Character aChar = '\u000d';
}

尝试编译它,你会得到一个错误,比如:

A1.java:2: illegal line end in character literal
              Character aChar = '\u000d';
                                ^

为什么一段等价的C#代码没有显示出这样的问题?

public class CharacterFixture
{
  char aChar = '\u000d';
}

共有1个答案

王念
2023-03-14

Java的编译器将\uxxxx转义序列转换为最初的步骤之一,甚至在令牌器破解代码之前。当它真正开始标记化时,不再有\uxxxx序列;它们已经被转换成它们所代表的字符,所以对于编译器来说,您的Java示例看起来就像您实际上以某种方式在其中键入了一个回车符一样。它这样做是为了提供一种在源代码中使用Unicode的html" target="_blank">方法,而不考虑源文件的编码。即使是ASCII文本也可以在必要的情况下完全表示Unicode字符(以可读性为代价),而且由于这样做得很早,您几乎可以在代码中的任何地方使用它们。(您可以说\u0063\u006c\u0061\u0073\u0073\u0020\u0053\u0074\u0075\u0066\u0020\u007b\u007d,编译器会将其读作class Stuff{},如果您想烦人或折磨自己的话。)

C#不这样做。\uxxxx稍后与程序的其余部分一起翻译,并且仅在某些类型的令牌(即标识符和字符串/字符文字)中有效。这意味着它不能用于Java中可以使用的某些地方。例如,cl\u0061ss不是关键字。

 类似资料:
  • 问题内容: 在Java中,如果将s,s或s相除,则总会得到一个。如果操作数之一是,我们将得到。 我的问题是-为什么或除法不会导致或?为什么总是? 显然,我不是在寻找“因为JLS这样说”的答案,而是在询问Java语言中此设计决策的技术原理。 考虑以下代码示例: 除以一个字节就不能了,可以吗? 那么为什么一定是一个?为什么不能有? 为什么必须如此,结果总是合适的,不是吗? 更新资料 正如@Eran所指

  • 我在写Fizz Buzz的时候遇到了一个意想不到的互动。如果我执行

  • 问题内容: 遇到一个错误地使用 而不是 在其代码中的人,它没有显示为编译错误。 是因为 是相同的 ? 问题答案: 没有编译错误,因为它是有效的(尽管相当无用) 一元运算符 ,其使用方式与以下方式相同: Java语言规范中的相关部分是Unary Plus运算符+(第15.15.3节) 。它指定调用一元运算会导致操作数的一元数值提升(第5.6.1节)。这意味着: * 如果操作数是编译时类型的,,,或,

  • 对于我的Java类,要求我们在working For语句中添加分号,并解释为什么输出是这样的。我不明白为什么添加分号会产生错误的树类型错误,导致代码无法编译。代码下面是输出;我还向any标记添加了反斜杠,因为它不会以其他方式显示。那么,为什么for语句后面的分号会导致这样的错误呢?提前谢谢。 运行时间:

  • 问题内容: 我正在尝试从系统上的TTF文件创建java.awt.Font实例,但是只有某些字体能够正确加载。下面的代码是我在网上找到的一些测试代码。在我的系统上运行时,它能够成功加载285种字体(例如Arial.ttf),但无法加载83种字体(例如AmericanTypewriter.ttf)。 所有错误均为无内在原因的形式。 java.awt.Font和格式兼容性是否存在已知问题?经过大量Goo

  • 问题内容: 请说明执行以下代码部分时究竟发生了什么: 这打印出13; 打印出21; 打印出64。 问题答案: 您已为字符变量分配了一个变量,该字符变量由单引号引起来,例如(不同于与字符串文本由双引号引起来的,例如)。Java会自动将16位无符号转换为32位带符号。 但是,当字符文字是反斜杠后跟1-3个数字时,它是字符的 八进制 (基数/基数 8)表示。从而: = 1×8 + 5 = 13(回车;与