Ошибка в String.format / Formatter? - PullRequest
       29

Ошибка в String.format / Formatter?

3 голосов
/ 20 февраля 2011

Из любопытства я попытался создать действительно большую строку.Оказалось, что дроссели класса Formatter при спецификациях ширины, превышающих Integer.MAX_VALUE:

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

, поэтому я пошел, чтобы убедиться, что это действительно соответствует спецификации.Но все, что он говорит, это

Если спецификатор формата содержит ширину или точность с недопустимым значением или иным образом не поддерживается, то соответственно будет выброшено исключение IllegalFormatWidthException или IllegalFormatPrecisionException.

Так что, по моему мнению, правильное поведение было бы бросить IllegalFormatWidthException.

Документирована ли эта ошибка (?) Где-нибудь?(Если нет, я пойду сообщать об этом.)


Также следует отметить, что если поставить ширину - перед шириной (чтобы выровнять вывод по левому краю):

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

это действительно выдает MissingFormatWidthException (что, на мой взгляд, кажется правильным поведением).

(я использую OpenJDK версии 1.6.0_20.)

Ответы [ 2 ]

2 голосов
/ 20 февраля 2011

Я думаю, что вы правы, и это ошибка: она должна вызвать исключение IllegalFormatWidthException, если есть существующее исключение.

Javadoc для этого исключения говорит: «Непроверенное исключение выдается, когда ширина формата имеет отрицательное значение, отличное от -1 или иным образом не поддерживается», что, как ни странно, конкретно не упоминает слишком большие значения. Я думаю, что предложение «иначе не поддерживается» делает это разумным исключением.

1 голос
/ 20 февраля 2011

Документация формата / форматера должна учитывать этот случай, который вызван попыткой записать строку в аппендер формата, которая превышает максимальную длину строки. Если вам действительно нужно это сделать, вам придется использовать поток.

См. Максимальная длина строки в Java - вызов метода length ()

...