以下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();
}
}
这是预期的行为。 Javadoc说
throws UnsupportedOperationException - 如果此缓冲区未由可访问的数组支持
您应该尝试其他方法或搜索其他实现,例如
mDirectBuffer = ByteBuffer.wrap(new byte[TEST_BUFFER_SIZE]);
如果生成的缓冲区没有可访问的数组支持,则会在运行时发生此异常。您可以尝试使用allocate()方法。