我試圖將套接字連接到一個不存在的服務器,我真的不明白爲什麼一個例外是不被提出。插座不拋出異常,雖然他無法連接
這裏是我的代碼:
public class TestSocket extends Activity {
private static final String TAG = "TestSocket";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BasicThread t = new BasicThread();
t.start();
}
class BasicThread extends Thread {
@Override
public void run() {
Log.d(TAG, "Before");
try {
new Socket("42.42.42.42", 12345);
Log.d(TAG, "Connected");
} catch (Exception e) {
Log.d(TAG, "Exception");
}
Log.d(TAG, "After");
}
}
}
我還試圖用我自己的IP地址,而運行Wireshark的,我第一次從Android的從我的電腦得到[SYN]
我的電腦,然後[RST, ACK]
到Android(因爲沒有什麼是在此端口監聽),但我仍然沒有在Android上遇到異常情況。
另外我正在測試一個物理電話(Nexus S),並且在我的Manifest中確實有互聯網許可。
爲什麼我沒有收到Exception
?
編輯:
更準確地說,輸出我得到的是
D/TestSocket(17745): Before
D/TestSocket(17745): Connected
D/TestSocket(17745): After
(而不是Exception
)
是的,我期待IOException被拋出,但事實並非如此,什麼都不會拋出。 – 2011-04-19 15:14:57
我期望它吞下異常(我曾經有編碼模擬替換Socket的經驗,構造函數對異常處理來說確實是一團糟)。您可以嘗試使用無參數構造函數創建一個Socket,然後明確調用connect並查看是否會得到一個異常。你也可以在構造函數之後檢查套接字的連接狀態,然後拋出你自己的IOException,或者只是失敗:) – 2011-04-19 15:19:35
我試過了(用Joseph Earl的答案代碼),並且我有完全相同的結果。 – 2011-04-19 15:21:17