0

这是我的代码:

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 秒没有返回任何东西时会抛出它吗?
编辑
刚刚查找了javadocs,发现只有IOException在无法连接到服务器时才会抛出getResponse代码。

4

3 回答 3

2

我想知道这个连接时间异常是什么时候抛出的,哪一行抛出它。

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

但是,最好的答案是自己尝试并查看。对整个事情进行尝试/捕获,尝试连接到将要超时的 URL,然后检查堆栈跟踪以查看超时异常的来源。


刚才查了javadocs,发现只有在连接不上服务器的时候getResponseCode()才会抛出。IOException

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


Eugenio的回答也是正确的。setConnectTimeout(...)您必须在尝试连接之前打电话。如果你之后设置它,超时没有效果。


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

据推测,这是因为它无法进行 DNS 查找来解析 URL 中的主机名。或者(更可能是 IMO),由于 URL 格式不正确而引发了此异常……这完全是一个不同的问题。如果真正的问题是有人输入了错误的 URL,那么您不想告诉用户互联网已关闭!

如果你想测试你是否有互联网连接,你需要做一些较低级别的事情...... 例如

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

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

于 2012-05-04T11:24:14.090 回答
1

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

假设您正在使用 URLConnection,如果您已经调用了 connect(),或者隐式执行连接的方法之一,它根本没有任何效果。

如果连接是使用 getOutputStream 方法隐式建立的,则将在您的第二行代码中引发异常

如果无法在指定时间内建立连接,则会引发 java.net.SocketTimeoutException。有关连接方法和设置连接参数的更多信息在这里

于 2012-05-04T11:26:37.357 回答
0

我想知道这个连接时间异常是什么时候抛出的

当连接尝试超时时抛出。

以及哪条线抛出它。

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

于 2012-05-04T12:19:27.137 回答