java.lang.IllegalArgumentException:非正MaxByteSpercar

java.lang.IllegalArgumentException:非正MaxByteSpercar,java,character-encoding,Java,Character Encoding,我们有一个多线程java应用程序,它正在执行文件操作并初始化字符集编码,如下所示 Charset charset; CharsetDecoder decoder; CharsetEncoder encoder; String charsetCoding = CharsetUtil.getJVMCharset(); charset = Charset.forName(charsetCoding); decoder = charset.newDecod

我们有一个多线程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
我们最近开始在执行过程中随机看到下面的异常,当我们尝试重新处理同一个文件时,它得到了处理,没有任何错误,谷歌没有帮助,因为我们找不到任何类似的错误

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
我有CharsetEncoder的源代码,如下所示,正在获取请查看:

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


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

您使用的是什么版本的Java?在我的(oracle 7)中,查看源代码,我不知道如何获得该异常。在1.6中,只有一个
Encoder
构造函数,它将
maxbytespercar
的文本值1传递给
super()
。但很明显,您使用的是另一个版本,因为您有两个
编码器
构造函数。我们关注的是JDK 1.5问题是,直到最近,这段代码工作正常,我们开始随机出现此错误。我怀疑可能是操作系统配置发生了一些变化,但我无法找到导致这种情况的原因。@user2112430不太可能是操作系统配置造成的。可能是Java更高版本中修复的并发错误。难道你不能打开
sun.nio.cs.ISO_8859_1.Encoder
的源代码并检查它的功能吗?@assylias我已经在原来的帖子中添加了我的评论。我检查了代码,这仍然是神秘的错误是如何来的。
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);
  }
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");