我无法捕获SocketTimeoutException()

时间:2015-01-06 11:14:41

标签: java sockets exception client server

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

我有一个服务器/客户端聊天应用程序,客户端使用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();
}

( - 一个Communication获取一个Socket并管理所述Socket的InputStreams。com.get()是 只是一个调用in.readLine()的方法,其中in是InputStream的BufferedReader - )

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

编辑:

get()Methode

 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());

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

明确是完全不同的问题,但是下面代码中的一个常见/次要问题

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

使用这段代码,即使发生异常,您也不会看到异常。这被称为吞咽异常。显示e.printStackTrace以在输出中获取异常。

答案 2 :(得分:0)

好的,异常现在已经消失了! 这是更新的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()。感谢所有帮助过我的人!