【问题标题】:Understanding Java IOException了解 Java IOException
【发布时间】:2011-04-28 13:09:30
【问题描述】:

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

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

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

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

例如如果应用程序检测到 IOException,它是什么类型的 IOException? End-Of-File、File-Is-Closed、File-Not_found、File-In-Use 等

【问题讨论】:

    标签: java ioexception


    【解决方案1】:

    异常中没有“返回码”值(通常),但它们确实包含错误消息。您应该在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 上显示(适当的部分)它们。

    【讨论】:

      【解决方案2】:

      没有错误代码,但经常有消息。例如,它们可以包含文件名或其他详细信息,以帮助您找出问题所在。

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

      要处理它们,您可以使用不同的catch 短语。 请记住从多到少的特定异常(如果您在第一个块中捕获IOException,则更特定的块(例如FileNotFoundException)将永远无法工作)。有时你可能想用一个catch (IOException) 来捕捉它们——如果你不需要以不同的方式处理子类的话。

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

      【讨论】:

        【解决方案3】:

        您应该考虑要以特定方式处理哪些异常(而不是使用 catch all 块)。找到候选对象后,您必须根据它们的继承树来捕获它们,首先越具体,然后越通用(从子类到超类)。请注意,如果您的黑名单包含太多必须捕获的异常并且它们仅属于一次尝试,您应该考虑将该尝试块拆分为更小的部分。

        【讨论】:

          【解决方案4】:

          您可以通过使用 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.
          
          }
          

          【讨论】:

            【解决方案5】:

            为了以不同的方式处理 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
            }
            

            【讨论】:

              猜你喜欢
              • 2012-08-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-02-24
              • 2016-10-03
              • 1970-01-01
              • 2012-09-05
              相关资源
              最近更新 更多