java.nio.ByteBuffer.array上的java.lang.UnsupportedOperationException(ByteBuffer.java:959)

问题描述 投票:0回答:2

以下Java代码编译,但运行时出错:

# javac ByteBufTest.java
# java ByteBufTest
Exception in thread "main" java.lang.UnsupportedOperationException
    at java.nio.ByteBuffer.array(ByteBuffer.java:959)
    at ByteBufTest.<init>(ByteBufTest.java:12)
    at ByteBufTest.main(ByteBufTest.java:33)
# 

为什么会这样?

注意:接下来,我需要在JNI中使用mDirectBuffer,因此我必须使用ByteBuffer.allocateDirect(TEST_BUFFER_SIZE)函数。

ByteBufTest.java

import java.nio.ByteBuffer;

public class ByteBufTest {

    public static final int TEST_BUFFER_SIZE = 128;

    private ByteBuffer mDirectBuffer;

    public ByteBufTest() {
        mDirectBuffer = ByteBuffer.allocateDirect(TEST_BUFFER_SIZE);
        byte[] buf = mDirectBuffer.array();
        buf[1]=100;
    }

    public void test() {

        printBuffer("nativeInitDirectBuffer",mDirectBuffer.array());

    }

    private void printBuffer( String tag, byte[] buffer ) {
        StringBuffer sBuffer = new StringBuffer();
        for( int i=0; i<buffer.length; i++ ) {
            sBuffer.append(buffer[i]);
            sBuffer.append(" ");    
        }
        //System.out.println(tag+sBuffer);
    }

    public static void main(String[] args) throws Exception {

        ByteBufTest item = new ByteBufTest();
        item.test(); 
    }
}
java bytebuffer
2个回答
1
投票

这是预期的行为。 Javadoc说

throws UnsupportedOperationException - 如果此缓冲区未由可访问的数组支持

您应该尝试其他方法或搜索其他实现,例如

mDirectBuffer = ByteBuffer.wrap(new byte[TEST_BUFFER_SIZE]);

1
投票

如果生成的缓冲区没有可访问的数组支持,则会在运行时发生此异常。您可以尝试使用allocate()方法。

© www.soinside.com 2019 - 2024. All rights reserved.