2013-02-26 1 views
4

У нас есть многопоточное Java-приложение, которое выполняет работу с файлами и инициализирует кодировку кодировки, как показано ниже.java.lang.IllegalArgumentException: Неположительный maxBytesPerChar

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. * Packages). Я декомпилировал класс 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, как показано ниже, которая становится < 0 значение Eventhough кодер прошло 1,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"); 
+2

какая версия Java вы используете? На моем (оракул 7), глядя на исходный код, я не вижу, как вы можете получить это исключение. – assylias

+1

В 1.6 существует только один конструктор «Encoder», и он передает буквальное значение 1 в 'super()' для 'maxBytesPerChar'. Но ясно, что вы используете другую версию, потому что у вас есть два конструктора Encoder. –

+0

Мы на JDK 1.5 Проблема заключается в том, что этот кусок кода работал нормально до недавнего времени, и мы начали получать эту ошибку случайным образом. Я подозреваю, что это может быть изменение конфигурации ОС, но я не могу найти, что может быть причиной этого. – user2112430

ответ

0

Посмотрите : http://docs.oracle.com/javase/7/docs/api/java/nio/charset/CharsetEncoder.html

В конце текста в начале g API, он говорит: «Экземпляры этого класса небезопасны для использования несколькими параллельными потоками».

Вы используете один объект CharsetEncoder в нескольких потоках?

Смежные вопросы