У нас есть многопоточное 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");
какая версия Java вы используете? На моем (оракул 7), глядя на исходный код, я не вижу, как вы можете получить это исключение. – assylias
В 1.6 существует только один конструктор «Encoder», и он передает буквальное значение 1 в 'super()' для 'maxBytesPerChar'. Но ясно, что вы используете другую версию, потому что у вас есть два конструктора Encoder. –
Мы на JDK 1.5 Проблема заключается в том, что этот кусок кода работал нормально до недавнего времени, и мы начали получать эту ошибку случайным образом. Я подозреваю, что это может быть изменение конфигурации ОС, но я не могу найти, что может быть причиной этого. – user2112430