gpt4 book ai didi

Java NIO ByteBuffer.put空指针异常

转载 作者:行者123 更新时间:2023-12-05 07:51:31 25 4
gpt4 key购买 nike

这是我的第一篇文章,所以请放轻松 :)。我正在重构一些连接代码以使用非阻塞 IO,并且在调用 byteButter.put(byte[]) 或 byteBuffer.put(byte[],index,length) 时遇到空点异常。异常发生在这一行

localBuffer.put(sendLengthBuffer,0,sendLengthBuffer.length);

奇怪的是空指针只出现在我第一次调用该方法时,所有后续的写入尝试都按预期运行。

代码:

public void write(SocketChannel sc,PayloadLength pl,ArrayBlockingQueue<byte[]> queue) throws IOException{
while(!queue.isEmpty()){
byte[] message = queue.poll();
if(message != null && message.length > 0){
if(bufferHasRemaining()){
SystemLogger.getLogger().logMe(LoggerLevel.INFO, this.getClass().getSimpleName(), "writer compacting");
localBuffer.compact();
}else{
SystemLogger.getLogger().logMe(LoggerLevel.INFO, this.getClass().getSimpleName(), "writer compacting");
localBuffer.clear();
}
//calculate the message length
byte[] sendLengthBuffer = new byte[pl.getLengthSize()];
pl.parseWriteLength(sendLengthBuffer, message.length);
localBuffer.put(sendLengthBuffer,0,sendLengthBuffer.length);
localBuffer.put(message,0,message.length);
localBuffer.flip();

// //write until buffer is empty
// //TODO: potential infinite loop here
// while(localBuffer.hasRemaining()){
// sc.write(localBuffer);
// }
sc.write(localBuffer);
if(bufferHasRemaining()){
//could not write all bytes to channel, most likely the sockets write buffer is full
break;
}

}
}

这是堆栈跟踪:

EXCEPTION: null - null
STACK TRACE:
java.nio.HeapByteBuffer.put(HeapByteBuffer.java:189)
com.discover.paymentservices.commons.net.nio.NIOWriteHandler.write(NIOWriteHandler.java:57)
com.discover.paymentservices.tibco.channel.nio.BaseNIOConnectionHandler.run(BaseNIOConnectionHandler.java:603)

*****编辑*****结果空指针是在分配 byteBuffer 后立即调用 byteBuffer.compact() 的结果。仍然不确定为什么在这种情况下空指针会被抛出到 put() 上,但我似乎找到了解决方案。感谢评论!

最佳答案

本地缓冲区似乎是在另一个线程中创建的,但是本地缓冲区的字段不是线程安全的,因此您不会立即看到它们。

我建议使用 ThreadLocal 直接字节缓冲区。直接字节缓冲区比堆缓冲区更高效,因为它不需要额外复制到 native 内存。

关于Java NIO ByteBuffer.put空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34902972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com