【问题标题】:Java Socket - how to catch Exception of BufferedReader.readline()Java Socket - 如何捕获 BufferedReader.readline() 的异常
【发布时间】:2012-11-28 05:01:58
【问题描述】:

我有一个从套接字读取数据的线程(比如说 T1):

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 处于活动状态并将 running 设置为 false,关闭套接字
  • 上下文切换
  • 因为 T1 阻塞并且 T2 关闭了套接字,所以 T1 抛出异常。我想要的是捕捉这个 SocketException。我不能在 T1.run() 中放置 try/catch(SocketException)。那么我怎样才能在 T1 的运行方法中捕捉到它呢?如果在 T1 的运行中无法捕捉到它,那我怎么能在其他地方捕捉到它呢?

PS:“关于线程调试的另一个问题”
通常,当我逐步调试代码时,我会在上下文切换中丢失“活动运行线”。假设我在 T1 的第 20 行,发生上下文切换,假设程序从 T2 的 30.line 继续,但调试器没有转到/显示到 T2 的 30.line,而是“活动运行行” '消失。所以我失去了对代码的控制。我使用 Eclipse for Java 和 Visual Studio for C#。那么在调试上下文切换时跟踪代码的最佳方法是什么?

【问题讨论】:

  • SocketException 扩展 IOException。所以你的catch 子句应该赶上SocketException
  • 为什么不能在 T1 的 run() 方法中捕捉到 SocketException? (它是IOException 的子类,因此无论如何它都会被现有的catch 子句捕获。如果您想单独捕获它,只需将其列在前面的catch 子句中即可。)
  • 我知道。但不知何故,我不知道为什么,程序没有捕捉到它。我的意思是我在那里放了一个断点,但程序永远不会在 catch 块中停止。
  • 为什么要在循环中实例化阅读器?
  • @Blesh:实际上我在其他地方做。我只是把它放在那里以缩短代码并专注于 readline

标签: java multithreading sockets


【解决方案1】:

对于假设您使用线程池的问题,也许您应该创建一个 ThreadFactory,在所有线程上安装 Thread.UncaughtExceptionHandler,然后在 ExecutorService 上使用 execute() 而不是 submit() 调用您的工作。

对于您的调试问题,也许您应该阅读 http://msdn.microsoft.com/en-us/library/ms164746.aspx

【讨论】:

    【解决方案2】:

    您的代码还有其他几个问题,因此我将同时解决所有问题。

    1. 您必须在循环之外创建BufferedReader 。否则,您将丢失缓冲区中的数据,每次循环都被丢弃。
    2. 您必须测试readLine() 的结果是否为空。如果你得到它,你必须关闭BufferedReader并退出循环。
    3. 如果遇到任何异常,您还必须关闭 BufferedReader 并退出循环。

    我想要的是捕捉这个 SocketException。

    所以抓住它。

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

    你必须。没有选择。由于以上几点,您无论如何都必须完全重写它。

    【讨论】:

      猜你喜欢
      • 2011-01-04
      • 2016-03-10
      • 2010-11-25
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      相关资源
      最近更新 更多