3

好奇心から、本当に大きな文字列を作成しようとしました。Formatterを超える幅の仕様でクラスがチョークすることが判明しましたInteger.MAX_VALUE

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

それで、実際に仕様どおりであることを確認するために出発しました。しかし、それが言うすべては

書式指定子に無効な値またはサポートされていない幅または精度が含まれている場合、それぞれ IllegalFormatWidthException または IllegalFormatPrecisionException がスローされます。

したがって、私の意見では、正しい動作はIllegalFormatWidthException.

このバグ (?) はどこかに文書化されていますか? (そうでない場合は、報告に行きます。)


-また、幅の前に a を付けると (出力を左揃えにするため)、次のようになることに注意してください。

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

それは実際に a をスローします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 に答える