似乎不可能时,编译器警告图可能未被初始化 Java
Compiler warning map may not of been initialised when it seems impossible Java
我写的这个线程有三个 try catch。首先是尝试使用资源来设置 ObjectOutputStream。第二个从另一个接收关于身份验证是成功还是失败的信息。成功时它应该建立一个用于通信的映射,失败时线程从中返回。同样,如果在此阶段发生 Interrupt 或 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){}
}
我错过了什么?谢谢
我不确定原因是什么,但我将中断移到了第二个内部块的单独捕获中,它不再引发异常。
我写的这个线程有三个 try catch。首先是尝试使用资源来设置 ObjectOutputStream。第二个从另一个接收关于身份验证是成功还是失败的信息。成功时它应该建立一个用于通信的映射,失败时线程从中返回。同样,如果在此阶段发生 Interrupt 或 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){}
}
我错过了什么?谢谢
我不确定原因是什么,但我将中断移到了第二个内部块的单独捕获中,它不再引发异常。