2010-03-23 199 views
5

我有以下3行的代码:如果抛出IOException,我该怎么办?

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

编译器抱怨所有这些3条线,并且它的抱怨是所有3条线是相同的:未报告异常java.io.IOException的;更详细地说,这些例外是由new ServerSocket,accept()getInputStream()引起的。我知道我需要使用try ... catch ...。但为此,我需要知道这些例外在每个特定情况下的意义(我应该如何解释它们)。什么时候发生?我的意思是,不是一般的,而是在这三种特殊情况下。

回答

5

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

一般来说,所有三个项目都围绕套接字进行解析。所以原因与网络问题有关。可能是:

  • 根本没有网络,甚至没有本地主机(将是一个严重的技术问题)。
  • 当端口号已被使用时(新服务器套接字(earPort))
  • 网络问题 - 例如somseone在某些东西期间偶然发现电缆。也可能导致质量差,DDOS攻击等。
  • 端口耗尽 - 没有客户端端口可用于新连接。

基本上围绕这条线。

只要你真正对流进行了某些操作,就会发生或者能够发生。

在THI scase你ahve两种可能的主要原因:

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

+1这是答案的核心。想想可能出现什么问题。该API告诉你,它不会总是出于无法控制的原因。你想如何处理这种错误情况?一旦你知道这个问题的答案,你就会知道你想要做什么来满足编译器。 – Yishai 2010-03-23 15:46:41

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() 
    } 
} 
1

一般来说它不完全没关系什么导致了最初的IOException,因为您的应用程序可以做些什么来纠正这种情况。

但是,作为您“做什么”问题的一般答案,您有几个选项。

  • 再试一次 - 工作,如果问题是间歇性的。请记住提供一个休息条件,如果它没有。
  • 尝试别的东西 - 从不同位置或通过不同方法加载资源。
  • 放弃 - 投掷/重新抛出异常和/或放弃动作或者整个程序。您可能希望在这一点上提供用户友好的消息... ;-)如果您的程序要求输入功能,然后没有输入离开你几乎没有选择,但不起作用
相关问题