3

出于好奇,我尝试创建一个非常大的字符串。事实证明,Formatter班级因宽度规格超过而窒息Integer.MAX_VALUE

// Produces an empty string. (2147483648 = Integer.MAX_VALUE + 1)
String.format("%2147483648s", "");

所以我去验证它确实符合规范。但它所说的只是

如果格式说明符包含具有无效值或不受支持的宽度或精度,则将分别抛出 IllegalFormatWidthException 或 IllegalFormatPrecisionException。

所以在我看来,正确的行为是抛出一个IllegalFormatWidthException.

这个错误(?)是否记录在某处?(如果没有,我会去报告它。)


另外,应该注意的是,如果将 a-放在宽度前面(左对齐输出):

String.format("%-2147483648s", "");

它确实抛出了一个MissingFormatWidthException(在我看来,这似乎是正确的行为)。

(我使用的是 OpenJDK 版本 1.6.0_20。)

4

2 回答 2

2

我认为您是对的,这是一个错误:如果存在任何异常,它应该抛出 IllegalFormatWidthException。

该异常的javadoc说“当格式宽度为-1以外的负值或不受支持时抛出未经检查的异常”,奇怪的是没有特别提到太大的值。我认为“否则不受支持”条款使它成为一个合理的例外。

于 2011-02-20T10:52:40.210 回答
1

格式/格式化程序文档应该解决这种情况,这是由于尝试将字符串写入格式的附加程序而导致的,该格式超出了字符串的最大长度。如果您确实需要这样做,则必须使用流。

请参阅Java 中字符串的最大长度 - 调用 length() 方法

于 2011-02-20T10:54:09.600 回答