了解 Java IOException

2022-09-02 20:52:17

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

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

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

如果上述情况属实,如何区分各种 IOException 子类?

例如,如果应用程序检测到 IOException,那么它是哪种类型的 IOException?文件结束、文件已关闭、文件Not_found、文件使用中等。


答案 1

异常中没有“返回码”值(通常),但它们确实包含错误消息。您应该在块中处理它们,您可以在其中指定要处理的异常类型。您可以在一个块之后设置多个块,以不同方式处理不同类型的异常。将按指定的顺序调用 catch 块,第一个具有合适参数类型的块将处理异常。因此,您应该首先捕获更具体的异常类型,然后捕获更通用的异常类型。catchcatchtry

简单示例:

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 上显示(合适的部分)它们。


答案 2

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

请参阅 IOException 的子类,了解有关您可以获得哪些异常的更多想法。

要处理它们,您可以使用不同的短语。请记住从更多到不太具体的异常(如果你在第一个块中捕获,那么更具体的块(如)将永远不会起作用)。有时您可能希望用单个子类捕获它们 - 如果您不需要以不同的方式处理子类。catchIOExceptionFileNotFoundExceptioncatch (IOException)

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

推荐