这是我的代码:
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
。
答案 0 :(得分:2)
我想知道何时抛出此连接时间异常以及抛出哪一行。
我认为它会在打开输出流的语句中出现。
然而,最好的答案是亲自尝试看看。对整个事物进行try / catch,尝试连接到将要超时的URL,然后检查stacktrace以查看超时异常的来源。
刚刚查看了javadocs,发现当
getResponseCode()
无法连接到服务器时,IOException
只会抛出setConnectTimeout(...)
。
这可能是真的(......我并不完全相信......)但这并不意味着在此之前不会抛出异常。如果你考虑一下,那么几乎必须在此之前发生。如果尚未建立连接,则无法将数据写入和刷新到服务器!
Eugenio的回答也是正确的。您必须在尝试连接之前调用connectTimeout()
。如果之后进行设置,则超时无效。
所以这是我的实际问题。我想告诉用户他没有连接到互联网。为此,我给了
MalformedURLException
。但不是抛出超时异常,而是抛出InetAddress.getByName()
。
据推测,这种情况正在发生,因为它无法通过DNS查找来解析URL中的主机名。或者(更有可能是IMO),抛出此异常是因为URL格式错误......这完全是另一个问题。如果真正的问题是有人输入了错误的网址,你不想告诉用户互联网已关闭!!
如果你想测试你有互联网连接,你需要做一些较低级别的事情......就像它一样; e.g。
NetworkInterface
解析已知的DNS名称,或实际上,当你考虑所有可能出错的事情以防止有效的互联网访问时,确定“互联网正在运行”是相当困难的。
答案 1 :(得分:1)
创建连接和连接是一个多步骤过程,执行连接后,某些参数不会产生任何影响。
假设您正在使用URLConnection,如果您已经调用了connect()或其中一个隐式执行连接的方法,那么它根本就没有效果。
如果使用getOutputStream方法隐式进行连接,则会在第二行代码中抛出异常
如果无法在指定时间内建立连接,则抛出java.net.SocketTimeoutException。 有关connect方法和设置连接参数here
的详细信息答案 2 :(得分:0)
我想知道何时抛出此连接时间异常
尝试连接超时时抛出。
哪一行抛出它。
堆栈跟踪告诉你哪一行抛出它。