今天项目报出一个错,导致了Socket监听停止,错误如下:
java.nio.channels.CancelledKeyException
at sun.nio.ch.SelectionKeyImpl.ensureValid(SelectionKeyImpl.java:55)
at sun.nio.ch.SelectionKeyImpl.readyOps(SelectionKeyImpl.java:69)
at java.nio.channels.SelectionKey.isAcceptable(SelectionKey.java:342)
at mainll2.main(mainll2.java:62)
错误位置 :key.isAcceptable()
错误原因:
我在线程里把通道关闭时,监听会捕获一个键,但这个键是无效的,在用这个键去做判断时,就会报出上面那个错。
下面是我在测试过程中得出的几种解决方法:
1、在关闭通道之前要记得把键cancel掉。
2、在从迭代中取出键的后,先通过key.isValid()判断一下key的有效性,无效的continue掉。
3、给迭代套上try-catch,捕获异常,这样怎么都不会影响监听停止了。