multithreading - 当 Java 看起来不可能时,编译器警告图可能没有被初始化
问题描述
我写的这个线程有三个尝试捕获。第一个是尝试使用资源来设置 ObjectOutputStream。第二个从另一个接收有关身份验证是否成功或失败的信息。成功时,它应该建立一个用于通信的映射,失败时返回线程。同样,如果在此阶段发生中断或 IOException,则从该线程返回。据我所知,只有在成功验证的情况下才能达到第二次尝试捕获。第二个块负责处理它接收到的数据包,会话通过中断或请求它的数据包结束。我的问题是,在结束会话时,我需要用空的 Optional 替换上述与该线程有关的 ConcurrenHashMap 记录。这应该发生在前面概述的两种关闭机制中。然而,在 InterruptedException catch 块中负责此操作的行表示,尽管没有初始化就不可能到达该块,但该映射可能尚未初始化。
public void run(){
boolean quit = false;
Packet packet;
int cid, nid;
ConcurrentMap<Integer, Optional<BlockingQueue<Packet>>> channelMap;
try (ObjectOutputStream output = new ObjectOutputStream(new
BufferedOutputStream(sslSocket.getOutputStream()))) {
try {
packet = channel.take();
if (packet.getType() == AUTH_SUCCESS) {
cid = ((AuthSuccessPacket) packet).getCid();
nid = ((AuthSuccessPacket) packet).getNid();
channelMap = networkMap.get(nid);
channelMap.replace(cid, Optional.of(channel));
output.writeObject(packet);
} else {
output.writeObject(packet);
return;
}
}catch (IOException | InterruptedException e){
return;
}
while (!quit && !interrupted()) {
try {
packet = channel.take();
switch (packet.getType()) {
case ACK:
case MESSAGE:
case REQUEST_USER:
case RELAY_SHUTDOWN:
output.writeObject(packet);
break;
case END_SESSION:
if (packet.getSource() == cid) {
output.writeObject(packet);
channelMap.replace(cid, Optional.empty());
quit = true;
}
break;
}
}catch (IOException e){}
}
}catch (InterruptedException e){
channelMap.replace(cid, Optional.empty());
} catch (IOException e){}
}
我错过了什么?谢谢。
解决方案
我不确定原因是什么,但我将中断移动到第二个内部块的单独捕获,它不再引发异常。
推荐阅读
- c++ - 带着色器的现代 OpenGL 球体绘图
- c# - 将视图模型传递给 ASP.NET MVC 中的视图时出错
- outlook - 使用 C# 通过 ical-Subscribe(Request type :Webcal) Outlook 日历设置警报
- excel - 如何引用共享邮箱的非默认文件夹
- javascript - EventListener click 在移动设备和隐身窗口上不起作用
- reactjs - Node js vs React 关于错误的一些疑问
- vuejs2 - 在 VUEJS 中日历内的日期上显示名称
- reactjs - 将网站文件放在 public_html 中是否安全
- sql-server - 使用 Terraform 扩展磁盘 SQL Server 虚拟机
- python - 使用 Python 在 Databricks 中的另一个笔记本中动态创建一个笔记本