Java测验实现中客户端无法接收下一题的原因排查
移除注释后客户端停滞的原因分析
核心问题:空指针异常导致线程终止
- 集合初始化错误
Server类中初始化共享集合lista时,所有键对应的value都被设为null:
for(int i=1;i<l;i++) { lista.put(i, null); }
移除注释执行这段代码时:
for(Entry<Integer,List<String>> m: server.lista.entrySet()) { if(c==m.getKey()) { m.getValue().add(name); // 触发空指针异常 } }
m.getValue()返回null,调用add()方法直接抛出NullPointerException。
- 异常处理不当
UserThread的run()方法中捕获了所有Exception,但捕获后没有任何处理逻辑,直接让线程终止:
catch (Exception e) { // TODO: handle exception }
异常被静默处理后,线程直接退出,后续发送下一题的循环逻辑完全停止,客户端就会卡在等待下一题的状态。
次要问题:集合键不完整
Server中lengthHashMap()计算出题目数量是4,但初始化集合时用了i<l的循环,导致lista中只存在1、2、3三个键,当用户做完第4题时,遍历集合找不到对应键,不过这不是导致本次停滞的直接原因。
内容的提问来源于stack exchange,提问作者Broj 1
相关产品推荐
相关产品推荐

