5

以下のように、ファイル操作と文字セットエンコーディングの初期化を行うマルチスレッド Java アプリケーションがあります。

Charset charset;
CharsetDecoder decoder;
CharsetEncoder encoder;
String charsetCoding = CharsetUtil.getJVMCharset();                        
charset = Charset.forName(charsetCoding);
decoder = charset.newDecoder();
encoder = charset.newEncoder();  // Exception is thrown from this line

最近、実行中に以下の例外がランダムに表示されるようになりました。同じファイルを再処理しようとすると、エラーなしで処理されます。同様のエラーで何も見つからなかったため、Google は役に立ちません。

Caused by: java.lang.IllegalArgumentException: Non-positive maxBytesPerChar
    at java.nio.charset.CharsetEncoder.<init>(CharsetEncoder.java:175)
    at java.nio.charset.CharsetEncoder.<init>(CharsetEncoder.java:209)
    at sun.nio.cs.ISO_8859_1$Encoder.<init>(ISO_8859_1.java:116)
    at sun.nio.cs.ISO_8859_1$Encoder.<init>(ISO_8859_1.java:113)
    at sun.nio.cs.ISO_8859_1.newEncoder(ISO_8859_1.java:46)
    at myClass.readFile

誰かがこれについて助け、方向性を提供できるかどうかに感謝します。

jdk 5 の完全なソース コードが見つからないようです (私が持っているソースには、sun.* パッケージのコードが含まれていません) Encoder クラスを逆コンパイルしましたが、コードがハードコードされた値を渡しているため、これがどのように可能かわかりませんここでは「1.0」。

class ISO_8859_1$Encoder extends CharsetEncoder
{
  private final Surrogate.Parser sgp = new Surrogate.Parser();

  private ISO_8859_1$Encoder(Charset paramCharset)
  {
    super(paramCharset, 1.0F, 1.0F);
  }

以下のように CharsetEncoder のソースがあります。これは、エンコーダーが 1.0 を渡したにもかかわらず <0 値を取得しています。

protected CharsetEncoder(Charset cs,
             float averageBytesPerChar,
             float maxBytesPerChar)
{
this(cs,
     averageBytesPerChar, maxBytesPerChar,
     new byte[] { (byte)'?' });
}

「これ」は以下の関数を呼び出します

 protected
CharsetEncoder(Charset cs,
       float averageBytesPerChar,
       float maxBytesPerChar,
       byte[] replacement)
{
this.charset = cs;
if (averageBytesPerChar <= 0.0f)
    throw new IllegalArgumentException("Non-positive "
                       + "averageBytesPerChar");
if (maxBytesPerChar <= 0.0f)
    throw new IllegalArgumentException("Non-positive "
                       + "maxBytesPerChar");***
if (!Charset.atBugLevel("1.4")) {
    if (averageBytesPerChar > maxBytesPerChar)
    throw new IllegalArgumentException("averageBytesPerChar"
                       + " exceeds "
                       + "maxBytesPerChar");
4

1 に答える 1

1

見てください:http://docs.oracle.com/javase/7/docs/api/java/nio/charset/CharsetEncoder.html

API の冒頭のテキストの最後に、「このクラスのインスタンスは、複数の同時スレッドによる使用に対して安全ではありません」と記載されています。

複数のスレッドで単一の CharsetEncoder オブジェクトを使用していますか?

于 2013-07-23T14:31:41.137 に答える