簡體   English   中英

Java Socket - 如何捕獲BufferedReader.readline()的異常

[英]Java Socket - how to catch Exception of BufferedReader.readline()

我有一個Thread(假設是T1)從socket讀取數據:

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處於活動狀態並將運行設置為false,關閉套接字
  • 上下文切換
  • 因為T1阻塞而T2關閉了套接字,T1拋出異常。 我想要的是捕獲這個SocketException。 我不能在T1.run()中放一個try / catch(SocketException)。 那么我怎樣才能在T1的運行方法中捕獲它? 如果在T1的運行中無法捕獲它,那我怎么能在其他地方捕獲呢?

PS:“關於線程調試的另一個問題”
通常,當我逐步調試代碼時,我在上下文切換上丟失了“活動運行線”。 假設我在T1的第20行,發生上下文切換,讓我們假設程序從T2的30.line繼續,但是調試器不會顯示/顯示到T2的30.line,而是'active running line '消失了。 所以我失去了對代碼的控制權。 我使用Eclipse for Java和Visual Studio for C#。 那么在上下文切換時調試時跟蹤代碼的最佳方法是什么?

對於你的問題,假設你正在使用一個線程池,你可能應該創建一個ThreadFactory,在所有線程上安裝一個Thread.UncaughtExceptionHandler,然后在ExecutorService上調用execute()而不是submit()。

對於調試問題,您可以閱讀http://msdn.microsoft.com/en-us/library/ms164746.aspx

您的代碼還有其他幾個問題,所以我會同時解決所有這些問題。

  1. 您必須在循環創建BufferedReader 否則,每次循環時丟棄的緩沖區中的數據都會丟失。
  2. 您必須測試readLine()的結果為null。 如果你得到它,你必須關閉BufferedReader並退出循環。
  3. 如果出現任何異常,還必須關閉BufferedReader並退出循環。

我想要的是捕獲這個SocketException。

抓住它吧。

我不能在T1.run()中放置try / catch(SocketException)。

你必須。 沒有選擇。 由於上述條款,你必須完全重寫它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM