この接続時例外がいつスローされ、どの行がスローされるかを知りたいです。
出力ストリームを開くステートメントで発生すると思います。
ただし、最善の答えは、自分で試して確認することです。全体に try/catch を配置し、タイムアウトする URL への接続を試行してから、スタックトレースを調べて、タイムアウト例外がどこから来たかを確認します。
今javadocsを調べたところ、サーバーに接続できない場合にgetResponseCode()
のみスローされることがわかりました。IOException
それは本当かもしれません (... 私は完全に確信しているわけではありません...) しかし、これはそれまで例外がスローされないという意味ではありません。考えてみれば、その前にそれはほとんど起こらなければなりません。まだ接続を確立していない場合は、サーバーにデータを書き込んでフラッシュすることはできません!
Eugenioの答えも正しいです。setConnectTimeout(...)
接続を試行する前に電話する必要があります。後で設定すると、タイムアウトは無効になります。
だからここに私の実際の問題があります。インターネットに接続していないことをユーザーに伝えたい。そのために私はconnectTimeout()
. ただし、タイムアウト例外をスローする代わりに、スローしていMalformedURLException
ます。
おそらく、DNS ルックアップを実行して URL 内のホスト名を解決できないために、これが発生しています。あるいは(IMOの可能性が高い)、URLの形式が正しくないため、この例外がスローされています...そしてそれはまったく別の問題です。そして、実際の問題が誰かが間違った URL を入力したことである場合、インターネットがダウンしていることをユーザーに伝えたくありません!!
インターネット接続があることをテストしたい場合は、低レベルのことを行う必要があります... いわば; 例えば
- 既知の IP アドレスを持つホストへのソケット接続を開こうとすると、
- を使用
InetAddress.getByName()
して既知の DNS 名を解決しようとする、または
- このクラスを使用して
NetworkInterface
、ローカル マシンに「ライブ」ネットワーク インターフェイスがあるかどうかを確認します。
実際には、「インターネットが機能している」と判断することは、効果的なインターネット アクセスを妨げる可能性のある問題をすべて考慮すると、かなり困難です。