[
http://issues.apache.org/jira/browse/HARMONY-33?page=comments#action_12363077 ]
Paulex Yang commented on HARMONY-33:
------------------------------------
I agree with the cause, and the fix seems reasonable, but when I tried to apply
the fix , and ran the test provided, it throws another exception like this:
java.lang.IllegalStateException
at java.nio.charset.CharsetDecoder.flush(CharsetDecoder.java:516)
at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:244)
at bugtests.Harmony33.main(Harmony33.java:15)
Looking further into the CharsetDecoder.decode(ByteBuffer), I found the
decode(ByteBuffer) implements a whole decode procedure, which includes several
steps, just as the JavaDoc said(I copied it here):
<quote>
a decoding operation:
* Invoking the reset() method to reset the decoder if the decoder has been
used;
* Invoking the decode(ByteBuffer, CharBuffer, boolean) method until the
addtional input is not needed, the code>endOfInput parameter must be set to
false, the input buffer must be filled and the output buffer must be flushed
between invocations;
* Invoking the decode(ByteBuffer, CharBuffer, boolean) method last time, and
the the endOfInput parameter must be set to true
* Invoking the flush(CharBuffer) method to flush the output.
</quote>
So it will end the decode procedure by flush(CharBuffer). And the flush()
method will throw java.lang.IllegalStateException unless the CharsetDecoder's
is in END or INIT status, the relevant code is like this:
<quote>
public final CoderResult flush(CharBuffer out) {
if (status != END && status != INIT) {
throw new IllegalStateException();
}
..
}
</quote>
Now let's look back the original fix again, it return the CoderResult.OVERFLOW
directly without change the CharDecoder's status so that the following flush()
method will throw exception. A better alternatives to this fix is:
....
if(out.remaining() < replace.length() ) {
result = CoderResult.OVERFLOW;
} else{
out.put(replace);
continue;
}
.....
So that it will then break out of the while loop, set the status, and return.
Test shows it will exit normally.
P.S. I'm still suspicous about the alternative fix in fact, because in some
case the replace character isn't really insert into the output CharBuffer, I'm
not sure if it is correct behaviour and I will study it with more tests
later:).
> java.nio.BufferOverflow exception while decoding ByteBuffer with UTF-16
> charset
> -------------------------------------------------------------------------------
>
> Key: HARMONY-33
> URL: http://issues.apache.org/jira/browse/HARMONY-33
> Project: Harmony
> Type: Bug
> Components: Classlib
> Reporter: Vladimir Strigun
> Assignee: Geir Magnusson Jr
> Priority: Minor
>
> If I try to decode ByteBuffer with lengh 1 using UTF-16 decoder unexpected
> java.nio.BufferOverflow exception occured. Please see testcase below.
> import java.nio.*;
> import java.nio.charset.*;
> import junit.framework.TestCase;
> public class TestDecoder extends TestCase {
> public static void main(String[] args) {
> junit.textui.TestRunner.run(TestDecoder.class);
> }
> public static void testDecoder(){
> try{
> ByteBuffer bb = ByteBuffer.allocate(1);
> bb.put(0,(byte)77);
> CharsetDecoder utf16D = Charset.forName("UTF-16").newDecoder();
> CharBuffer cb =
> utf16D.onMalformedInput(CodingErrorAction.REPLACE).onUnmappableCharacter(CodingErrorAction.REPLACE).decode(bb);
> }catch(Exception e){
> fail("Exception occured: "+e);
> }
> }
> }
> Output on RI:
> .
> Time: 0,03
> OK (1 test)
> Output with Harmony:
> .F
> Time: 0,01
> There was 1 failure:
> 1) testDecoder(TestDecoder)junit.framework.AssertionFailedError: Exception
> occured: java.nio.BufferOverflowException
> at TestDecoder.testDecoder(TestDecoder.java:20)
> at
> java.lang.reflect.AccessibleObject.invokeV(AccessibleObject.java:211)
> at TestDecoder.main(TestDecoder.java:10)
> FAILURES!!!
> Tests run: 1, Failures: 1, Errors: 0
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira