代码之家  ›  专栏  ›  技术社区  ›  erotsppa

从Netty的ChannelBuffer.read找到了奇怪的索引自动发现错误?

  •  0
  • erotsppa  · 技术社区  · 15 年前

    在我的netty项目中有以下简单代码,它期望从上游读取一个整数。管道中没有编码器。

    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
            ChannelBuffer m = (ChannelBuffer) e.getMessage();
    
            m.readInt() 
        }
    

    java.lang.IndexOutOfBoundsException
        at org.jboss.netty.buffer.AbstractChannelBuffer.checkReadableBytes(AbstractChannelBuffer.java:657)
        at org.jboss.netty.buffer.AbstractChannelBuffer.readInt(AbstractChannelBuffer.java:272)
        at PushServer.Netty.PushClientHandler.messageReceived(PushClientHandler.java:33)
        at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:274)
        at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:261)
        at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:349)
        at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:281)
        at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:201)
        at org.jboss.netty.util.internal.IoWorkerRunnable.run(IoWorkerRunnable.java:46)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:637)
    

    有什么想法吗?

    1 回复  |  直到 15 年前
        1
  •  3
  •   trustin    15 年前

    也许你的管道里没有解码器?即使你的同伴写了4个字节,你也可能得到不到4个字节,因此很有可能得到IOOBE。事实上, a section in the official user guide 解释了完全相同的情况。