在java或scala中,在单引号内声明一个字符串会抛出
'错误:未关闭的字符文字'
我想知道是否有人可以告诉我编译器对单引号中的字符串进行类型检查的确切机制,然后确定错误。另外,为什么编译器会说'
未公开的字符文字
'代替
“String而不是char”
作为错误描述?
由于
答案 0 :(得分:2)
由于我不详细了解编译器的工作原理,我只能猜测:
在词法分析期间,当编译器看到它已经知道的起始'
时,它正在读取一个字符文字。因此它需要一个字符(或表示一个字符的转义序列,如\n
),然后关闭'
。如果找不到结束'
,则显示消息
error: unclosed character literal
才有意义。
答案 1 :(得分:2)
这通常由 lexical analyser 完成。正如维基百科的文章所说,这通常是由finite-state machine完成的,它非常快速且易于生成。
至于为什么它显示“unclosed character literal”而不是“string而不是char”是因为语言通常被解析的方式(与词法分析不同的步骤)使编译器更难以实现程序员的意图而不是对于一个看着它的人。编译器使用的 context 通常是有问题的部分左侧和上方,而不是整个上下文。
因此,在开头引号的左侧,无法判断错误是否是单引号,或者程序员是否将单引号与双引号混合在一起。这在Scala中通过符号的语法('aSymbol
)加以复制,这会阻止它使用下一个字符作为区分彼此的方式。
因此,最后,选择错误消息以反映最可能的错误,并且,对于来自Java,C或C ++的任何人来说,使用字符串周围的单引号不是习惯。对于来自Ruby,Perl或Python等脚本语言的人来说,这是另一个故事。
答案 2 :(得分:0)
编译器只需要文字中的一个字符(除非它是一个转义符。之后唯一有效的字符是结束单引号。如果它不存在,它会给出错误。
编译器无法读懂你的想法并且知道真正的问题是在单引号上。它假设您知道自己在做什么,并报告它实际看到的第一个错误。