我无法捕获 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()。感谢所有帮助过我的人!
解决方案:请参阅下面我的回答
我有一个 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()。感谢所有帮助过我的人!