java.lang.IllegalArgumentException:非正数maxBytesPerChar

时间:2013-02-26 18:21:50

标签: java character-encoding

我们有多线程的java应用程序,它正在进行文件操作并初始化charset编码,如下所示。

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

我们最近开始在执行期间随机查看下面的例外情况,当我们尝试重新处理同一个文件时,它会被处理而没有任何错误,谷歌没有任何帮助,因为我们无法找到任何类似错误,

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类,我看不出这是怎么回事因为代码传递的是硬编码值&#34; 1.0&#34;这里。

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时获得&lt; 0值

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

&#34;这&#34;调用函数

 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");

1 个答案:

答案 0 :(得分:0)

查看:http://docs.oracle.com/javase/7/docs/api/java/nio/charset/CharsetEncoder.html

在API开头的文本末尾,它说:“这个类的实例不适合多个并发线程使用。”

您是否在多个线程中使用单个CharsetEncoder对象?