我编译了这段代码。 (使用
javac 21.0.1
)
public static final String MAX = "AAAAA ...";
如果我在文字中重复 'A' 65534 次,编译就可以了。
但是,如果我在文字中重复“A”65535 次,则会收到编译错误“常量字符串太长”。
为什么长度限制是65534而不是65535?
CONSTANT_Utf8_info {
u1 标签;
u2 长度;
u1 字节[长度];
}length:length 项的值给出了字节数组中的字节数(而不是结果字符串的长度)。
u2 的最大长度是 0xFFFF = 65535,而不是 65534。
在UTF-8中,“A”是1个字节,那么字符串长度不是限制为65535吗?
private void checkStringConstant(DiagnosticPosition pos, Object constValue) {
if (nerrs != 0 || // only complain about a long string once
constValue == null ||
!(constValue instanceof String str) ||
str.length() < PoolWriter.MAX_STRING_LENGTH)
return;
log.error(pos, Errors.LimitString);
nerrs++;
}
正确的代码是
str.length() <= PoolWriter.MAX_STRING_LENGTH
吗?