2011-04-28 76 views
13

我需要一些帮助来理解IOException。我在网上查阅了很多信息,并查看了Oracle Java网站上的技术规范。了解Java IOException

我是否正确理解IOException类及其所有子类,并且没有关联的“错误消息”或“返回代码”值?

因此,如果想要发出一些消息和/或返回代码值,那么必须使用IOException catch逻辑插入它们?

如果以上情况属实,那么将如何区分各种IOException子类?

例如如果应用程序检测到IOException,它是什么类型的IOException?文件结尾,文件被关闭,文件未被找到,文件正在使用等。

回答

17

异常(通常)中没有“返回代码”值,但它们包含错误消息。您应该在catch块中处理它们,您可以在其中指定要处理的异常类型。在try块之后可以有几个catch块,以不同方式处理不同类型的异常。 catch块将按照指定的顺序被调用,而第一个具有合适参数类型的块将处理异常。所以你应该先捕捉更具体的异常类型,然后再捕捉更具体的异常类型。

简单的例子:

try { 
    ... 
    throw new FileNotFoundException("This is an error message"); 
    ... 
} catch (FileNotFoundException e) { 
    System.out.println("File not found: " + e.getMessage()); 
    ... 
} catch (EOFException e) { 
    System.out.println("End of file reached: " + e.getMessage()); 
    ... 
} catch (IOException e) { // catch all IOExceptions not handled by previous catch blocks 
    System.out.println("General I/O exception: " + e.getMessage()); 
    e.printStackTrace(); 
    ... 
} 

正如你在过去的catch块看,异常存储它们的起源,可以打印的堆栈跟踪。但是,像这里一样直接打印这样的消息通常不是一个好主意;在实际的生产代码中,您通常希望使用日志记录框架来记录这些消息,或者在UI上显示它们(合适的部分)。

1

您可以通过使用instanceof来确定异常或任何对象是什么类。但是,对于例外情况,您可以使用catch块。

} catch(FileNotFoundException e) { 
    // file not found handling 

} catch(EOFException e) { 
    // handle reaching the End-Of_File. 

} catch(IOException e) { 
    // generic IOException handling for any other IOException. 

} 
1

为了不同的方式处理IOException异常的子类,你必须单独追上他们,就像这样:

try { 
    // some code that may throw an exception 
} 
catch (EOFException e) { 
    // handle an end-of-file exception here) 
} 
... 
catch (IOException e) { 
    // handle an IOException that's not covered in previous catch statements 
} 
catch (Exception e) { 
    // handle any other kind of exception 
} 
3

有没有错误代码,但很多时候也有消息。例如,它们可以包含文件名或其他详细信息,以帮助您识别出错的地方。

请参阅IOException的子类以了解有关可以获得哪些例外的更多建议。

要处理它们,您可以使用不同的catch短语。 请记住,从更多到更具体的例外(如果您在第一个块捕获IOException,更具体的块如FileNotFoundException将永远不会工作)。有时你可能想用一个单独的catch (IOException)来捕捉它们 - 如果你不需要以不同的方式处理子类。

try { 
    // ... 
} catch (FileNotFoundException e) { 
    // ... 
} catch (IOException e) { 
    // ... 
} 
2

你应该考虑你想要以特定方式处理的异常(而不是捕获所有的块)。在你找到你的候选人后,你必须根据它们的继承树来捕捉它们,更具体的首先是更一般的(从子类到超类)。请注意,如果您的黑名单包含太多必须被捕获的例外,并且它们只属于一次尝试,那么您应该考虑将该尝试块分成更小的块。