我们有一个多线程的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,它也得到了
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");
最佳答案
看看:http://docs.oracle.com/javase/7/docs/api/java/nio/charset/CharsetEncoder.html
在API开头的文本结尾处,它表示:“此类的实例不能安全地被多个并发线程使用。”
您是否在多个线程中使用单个CharsetEncoder对象?