java - 为什么我在通过键时得到 CancelledKeyException?

标签 java exception networking nio

为什么我一天会收到几次 CancelledKeyException?我应该做些什么吗?我的代码有错吗?

        Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
        while (keys.hasNext()) {

            SelectionKey key = (SelectionKey) keys.next();
            keys.remove();

            try {
                if (key.isValid()) {
                    if (key.isReadable()) {
                        readHandler.handle((Connection) key.attachment());
                    }
                    if (key.isWritable()) {
                        writeHandler.handle((Connection) key.attachment());
                    }
                    if (key.isAcceptable()) {
                        acceptHandler.handle(key);
                    }
                }
            } catch (CancelledKeyException e) {
                _logger.error("CanceledKeyException in while loop:", e);
            }
        }

异常(exception):

java.nio.channels.CancelledKeyException: null
    at sun.nio.ch.SelectionKeyImpl.ensureValid(SelectionKeyImpl.java:55) ~[na:1.6.0_12]
    at sun.nio.ch.SelectionKeyImpl.readyOps(SelectionKeyImpl.java:69) ~[na:1.6.0_12]
    at java.nio.channels.SelectionKey.isWritable(SelectionKey.java:294) ~[na:1.6.0_12]
    at project.engine.io.SimpleReactor.work(SimpleReactor.java:194) ~[engine-02.06.11.jar:na]
    at project.server.work.AbstractWorker$1.run(AbstractWorker.java:20) [server-21.05.11.jar:na]
    at java.lang.Thread.run(Thread.java:619) [na:1.6.0_12]

最佳答案

其中一个处理程序可能会关闭 channel 。例如,读取处理程序应该在读取到 -1 时关闭 channel 。因此写处理程序将失败。实际上 isWritable() 会失败,正如我现在从您的堆栈跟踪中看到的那样。所以你必须用所有其他条件测试 isValid(),例如isValid() && isReadable(), isValid() && isWritable(),

关于java - 为什么我在通过键时得到 CancelledKeyException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6215065/

相关文章:

java - 对于包含使用 Immutables 生成的列表的 Java 类,如何从 json 字符串获取对象?

java - Hibernate:仅从一张表中选择所有内容,而不是从 3 个连接表中选择所有内容

java - 定义一个类的不同方法使用的变量和类的最有效方法是什么?

c# - 可能有意重新抛出 Resharper 异常

python - 扭曲的 react 堆过早停止

java - 构造函数注入(inject)阻止自定义资源处理

c++ - 通过 const 引用捕获异常并丢弃 const

c++ - 静态初始化的对象不能放在 try block 中

c - 无线 NIC 如何在硬件级别和功能上工作?

c - 搭建shell/BBS服务器推荐书籍