我有一個線程的異常(假設T1)從插座中讀取數據:Java Socket技術 - 如何捕捉BufferedReader.readline()
public void run() {
while (running) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String input = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
}
另一個線程(可以說T2)儘量完成計劃在其方法之一。因此T2執行以下操作:
T1.running = false;
socket.close();
下面是此方案針對我無法找到一個解決方案:
- T1處於活動狀態,等待一些輸入到讀即阻塞。
- 上下文切換
- T2處於活動狀態並正在運行到假套,關閉套接字
- 上下文切換
- 因爲T1被阻擋和T2關閉套接字,T1拋出異常。我想要的是捕捉這個SocketException。我不能在T1.run()中放置try/catch(SocketException)。那麼我怎樣才能在T1的運行方法中捕捉到它呢?如果在T1的運行中無法捕捉它,那我怎麼能在其他地方捕捉到它?
PS:
「有關線程調試另一個問題」通常當調試代碼分步實施,就失去一個上下文切換的「活性移動線」。假設我在T1的第20行,發生了上下文切換,我們假設程序從T2的第30行繼續,但調試器不會顯示到T2的第30行,而是顯示「主動運行行'消失了。所以我失去了對代碼的控制。我使用Eclipse for Java和Visual Studio for C#。那麼在調試上下文切換時跟蹤代碼的最佳方式是什麼?
'SocketException'擴展了'IOException'。所以你的'catch'子句應該捕獲'SocketException'。 – reprogrammer
爲什麼你不能在T1的'run()'方法中捕獲'SocketException'? (它是'IOException'的一個子類,所以它會被現有的'catch'子句捕獲,如果你想分別捕獲它,你只需要在早期的'catch'子句中列出它。) –
我知道。但不知何故,我不知道爲什麼,該計劃沒有抓住它。我的意思是我在那裏放置了一個斷點,但程序永遠不會在catch塊中停止。 –