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的主要内容,如果未能解决你的问题,请参考以下文章