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

Posted

技术标签:

【中文标题】java.nio.ByteBuffer.array(ByteBuffer.java:959) 处的 java.lang.UnsupportedOperationException【英文标题】:java.lang.UnsupportedOperationException at java.nio.ByteBuffer.array(ByteBuffer.java:959) 【发布时间】:2018-02-02 12:18:03 【问题描述】:

以下 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(); 
    

【问题讨论】:

【参考方案1】:

这是预期的行为。 Javadoc 声明

抛出 UnsupportedOperationException - 如果此缓冲区不受可访问数组的支持

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

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

【讨论】:

,我需要在JNI中使用mDirectBuffer,所以必须使用ByteBuffer.allocateDirect(TEST_BUFFER_SIZE)函数 对于JDK,字节缓冲区类的array()方法返回缓冲区内容的字节数组(byte [])。这仅对非直接缓冲区有效。当与直接缓冲区一起使用时,此方法会引发异常:UnsupportedOperationException。对于 android,array() 工作正常。【参考方案2】:

如果结果缓冲区不受可访问数组的支持,则会在运行时发生此异常。你可以试试 allocate() 方法。

【讨论】:

以上是关于java.nio.ByteBuffer.array(ByteBuffer.java:959) 处的 java.lang.UnsupportedOperationException的主要内容,如果未能解决你的问题,请参考以下文章