如果抛出IOException,我该怎么办?

时间:2010-03-23 11:59:36

标签: java exception-handling

我有以下3行代码:

ServerSocket listeningSocket = new ServerSocket(earPort);
Socket serverSideSocket = listeningSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(serverSideSocket.getInputStream()));

编译器抱怨所有这3行,并且它的抱怨对于所有3行是相同的:未报告的异常java.io.IOException;更详细地说,new ServerSocketaccept()getInputStream()抛出了这些异常。

我知道我需要使用try ... catch ...。但为此,我需要知道在每个特定情况下这个例外意味着什么(我应该如何解释它们)。什么时候发生?我的意思是,不是一般的,而是在这3个特殊情况下。

3 个答案:

答案 0 :(得分:5)

你不知道特别是因为IO异常也是一个“通用”异常,在技术上可能有很多原因。这意味着输入/输出发生了意想不到的问题,但显然它在本地硬盘上的原因与在互联网上的原因不同。

通常,所有三个项目都会解决套接字问题。因此,原因与网络问题有关。可能的是:

  • 根本没有网络,甚至没有localhost(这将是一个严重的技术问题)。
  • 端口号已被使用,当给出端口号时(新的服务器套接字(earPort))
  • 网络问题 - 例如somseone在某些事情中偶然发现了电缆。也可能是质量不佳,DDOS攻击等原因。
  • 端口耗尽 - 没有可用于新连接的客户端端口。

基本围绕这一行。

只要您真正对流进行某些操作,就会发生相同的情况。

在这个问题上,你有两个可能的主要原因:

  • 第一行:套接字已在使用中(程序启动2次,与其他程序相同的端口)。除非用户做某事,否则这通常是不可修复的。
  • 通用稍后的运行时错误。这些可能在正常操作期间发生。

答案 1 :(得分:1)

最简单的方法是声明您的调用方法抛出IOException,但是在离开方法之前需要清除finally子句中的已分配资源:

public void doSession ( ) throws IOException
{
  final ServerSocket listeningSocket = new ServerSocket(earPort);

  try
  {
    final Socket serverSideSocket = listeningSocket.accept();

    try
    {
      final BufferedReader in =
        new BufferedReader(
          new InputStreamReader(
            serverSideSocket.getInputStream()
          )
        );
    }
    finally
    {
      serverSideSocket.close( )
    }
  }
  finally
  {
    listeningSocket.close( )
  }
}

答案 2 :(得分:1)

一般来说,确切地说导致初始IOException的原因并不重要,因为您的应用程序几乎无法纠正这种情况。

但是,作为对“做什么”问题的一般回答你有几个选择。

  • 再试一次 - 可能如果问题是间歇性的话。如果没有,请记得提供休息条件。
  • 尝试其他方法 - 从其他位置或通过其他方法加载资源。
  • 放弃 - 抛出/重新抛出异常和/或中止操作或整个程序。此时您可能想要提供一个用户友好的消息... ;-)如果您的程序需要输入才能运行,那么没有输入会让您别无选择但不能运行< / em>的