[ 
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

Reply via email to