似乎不可能时,编译器警告图可能未被初始化 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){}
}

我错过了什么?谢谢

我不确定原因是什么,但我将中断移到了第二个内部块的单独捕获中,它不再引发异常。