什么时候抛出连接超时异常?

时间:2012-05-04 11:14:51

标签: java httpurlconnection

这是我的代码:

connection.setConnectTimeout(5000);
ObjectOutputStream out=new ObjectOutputStream(connection.getOutputStream());
out.writeObject(to_be_sent);
out.flush();
out.close();
int resp_code=connection.getResponseCode();
if(resp_code==200)
{
 JOptionPane.showMessageDialog(obj.frame, "Your Application has been sent Successfully");
}

如您所见,我已将连接超时设置为5秒。我想知道何时抛出此连接时间异常以及抛出哪一行。当connection.getResponseCode()在5秒内没有返回任何内容时抛出它吗?
编辑
刚查看javadoc并发现当无法连接到服务器时,getResponse代码仅抛出IOException

3 个答案:

答案 0 :(得分:2)

  

我想知道何时抛出此连接时间异常以及抛出哪一行。

我认为它会在打开输出流的语句中出现。

然而,最好的答案是亲自尝试看看。对整个事物进行try / catch,尝试连接到将要超时的URL,然后检查stacktrace以查看超时异常的来源。


  

刚刚查看了javadocs,发现当getResponseCode()无法连接到服务器时,IOException只会抛出setConnectTimeout(...)

这可能是真的(......我并不完全相信......)但这并不意味着在此之前不会抛出异常。如果你考虑一下,那么几乎必须在此之前发生。如果尚未建立连接,则无法将数据写入和刷新到服务器!


Eugenio的回答也是正确的。您必须在尝试连接之前调用connectTimeout()。如果之后进行设置,则超时无效。


  

所以这是我的实际问题。我想告诉用户他没有连接到互联网。为此,我给了MalformedURLException。但不是抛出超时异常,而是抛出InetAddress.getByName()

据推测,这种情况正在发生,因为它无法通过DNS查找来解析URL中的主机名。或者(更有可能是IMO),抛出此异常是因为URL格式错误......这完全是另一个问题。如果真正的问题是有人输入了错误的网址,你不想告诉用户互联网已关闭!!

如果你想测试你有互联网连接,你需要做一些较低级别的事情......就像它一样; e.g。

  • 尝试打开与您已知道其IP地址的主机的套接字连接
  • 尝试使用NetworkInterface解析已知的DNS名称,或
  • 使用{{1}}类来查看本地计算机是否具有“实时”网络接口。

实际上,当你考虑所有可能出错的事情以防止有效的互联网访问时,确定“互联网正在运行”是相当困难的。

答案 1 :(得分:1)

创建连接和连接是一个多步骤过程,执行连接后,某些参数不会产生任何影响。

假设您正在使用URLConnection,如果您已经调用了connect()或其中一个隐式执行连接的方法,那么它根本就没有效果。

如果使用getOutputStream方法隐式进行连接,则会在第二行代码中抛出异常

如果无法在指定时间内建立连接,则抛出java.net.SocketTimeoutException。 有关connect方法和设置连接参数here

的详细信息

答案 2 :(得分:0)

  

我想知道何时抛出此连接时间异常

尝试连接超时时抛出。

  

哪一行抛出它。

堆栈跟踪告诉你哪一行抛出它。