首页 > 解决方案 > 当 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){}
}

我错过了什么?谢谢。

标签: multithreadingjava-11

解决方案


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


推荐阅读