首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java ByteBuffer.put空指针异常

Java ByteBuffer.put空指针异常
EN

Stack Overflow用户
提问于 2016-01-20 14:38:29
回答 1查看 2.4K关注 0票数 3

这是我的第一篇帖子,所以请放心吧:)。我正在重构一些连接代码以使用非阻塞IO,并在调用byteButter.put(byte[])或byteBuffer.put(byte[]、索引、长度)时遇到一个空点异常。异常发生在这一行中。

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

奇怪的是,null指针仅在我第一次调用该方法时发生,所有后续的写入尝试都按预期的方式运行。

代码:

代码语言:javascript
复制
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;
                }

            }
        }

下面是堆栈跟踪:

代码语言:javascript
复制
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.compact()后立即调用byteBuffer()的结果。仍然不清楚为什么会在这个场景中在put()上抛出空指针,但我似乎已经找到了解决方案。谢谢你的评论!

EN

Stack Overflow用户

发布于 2016-01-20 15:24:16

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

我建议使用ThreadLocal直接字节缓冲区。直接字节缓冲区比堆缓冲区更有效,因为它不需要对本机内存进行额外的复制。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34902972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档