我无法捕获 SocketTimeoutException()

I can't catch SocketTimeoutException()

解决方案:请参阅下面我的回答

我有一个 Server/Client 聊天应用程序,其中客户端使用 P2P 进行通信(每个内部都有一个小服务器)。因此,每个客户端都有一个线程,该线程应不断监视是否有消息传入任何连接的套接字(=其他客户端)。但是因为 BufferedReader 的 readLine() 方法阻塞了,我想使用 SocketTimeoutException 来打破它,这样每个 Socket 都会被监视一小会儿,然后切换到下一个。

Socket tmp = add.getSocket();
try{
  tmp.setSoTimeout(2000);
  Communication com = new Communication(tmp);
  System.out.println(com.get());
} catch(SocketTimeoutException e){
  if(!running)return;
} catch(SocketException e){
    e.printStackTrace();
}

( -- 通信获取套接字并管理所述套接字的输入流。com.get() 是 只是一个调用 in.readLine() 的方法,其中 in 是 InputStream 的 BufferedReader --)

但是编译器说在 try 块中从来没有抛出 SocketTimeoutException。 但是,如果我没有捕捉到异常,在说超时之后我会得到 SocketTimeoutException。 我不知道如何解决这个问题

编辑:

get() 方法

 public String get() throws SocketTimeoutException {
                String str = null;
                try{
                        if(s.isClosed()==false) str =  in.readLine();
                } catch (IOException e){
                         if(e.getCause() instanceof SocketTimeoutException) {
                                 throw new SocketTimeoutException();
                        }
                         e.printStackTrace();
                }
                        return str;
        }


java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:152)
    at java.net.SocketInputStream.read(SocketInputStream.java:122)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:154)
    at java.io.BufferedReader.readLine(BufferedReader.java:317)
    at java.io.BufferedReader.readLine(BufferedReader.java:382)
    at Communication.get(Communication.java:46)
    at ListeningThread.run(ListeningThread.java:26)

ListeningThread.run() 是第一个代码片段嵌入的函数。 第26行是行

System.out.println(com.get());

可能是完全不同的问题,但有一个 common/minor 以下代码的问题

catch(SocketTimeoutException e){
  if(!running)return;
} 

有了这段代码,即使发生异常你也看不到。这称为异常吞噬。显示 e.printStackTrace 以获取输出中的异常。

SocketTimeoutException 扩展了 InterruptedIOException,InterruptedIOException 扩展了 IOException。 因此,正如 EJP 所说,如果抛出此异常,get 方法的 catch 块将捕获它。

好的,异常现在消失了! 这是更新后的 get() 函数:

    public String get() throws SocketTimeoutException {
            String str = null;
            try{
                    if(s.isClosed()==false) str =  in.readLine();
            } catch (IOException e){
                    try{
                            if(e instanceof SocketTimeoutException) {
                                    throw new SocketTimeoutException();
                            }
                    } catch (SocketTimeoutException f){
                    }
            }
                    return str;
    }

请注意在第二个 try{} 块之前缺少 e.printStackTrace()。感谢所有帮助过我的人!