代码之家  ›  专栏  ›  技术社区  ›  Sejanus

Java未报告异常

  •  5
  • Sejanus  · 技术社区  · 15 年前

    在学习Java的时候,我经常碰到这个错误。就像这样:

    未报告的异常java.io.fileNotFound异常;必须捕获或声明为引发。

    filenotfound只是一个例子,我见过很多不同的例子。在这种特殊情况下,导致错误的代码是:

    OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("myfile.pdf")));
    

    当我将语句放入try/catch块中时,错误总是消失,代码编译成功。有时对我来说已经足够好了,但有时不行。

    首先,我正在学习的示例并不总是使用Try/Catch,显然应该有效。

    更重要的是,有时当我将整个代码放入try/catch时,它根本无法工作。例如,在这种特殊情况下,我需要 关闭(); 在里面 最后 块;但如果上面的语句本身位于 试试 ,请 最后{} “看不见” 外面的 因此不能关闭它。

    我的第一个想法是 导入java.io.filenotfound; 或者另一个相关的例外,但没有帮助。

    2 回复  |  直到 15 年前
        1
  •  9
  •   cletus    15 年前

    你所指的是 checked exceptions ,表示必须声明或处理。在Java中处理文件的标准结构看起来像这样:

    InputStream in = null;
    try {
      in = new InputStream(...);
      // do stuff
    } catch (IOException e) {
      // do whatever
    } finally {
      if (in != null) {
        try {
          in.close();
        } catch (Exception e) {
        }
      }
    }
    

    难看吗?当然。冗长吗?当然。Java 7将使它与ARM块更好一点,但在此之前,你会被上面的问题所困扰。

    您还可以让调用者处理异常:

    public void doStuff() throws IOException {
      InputStream in = new InputStream(...);
      // do stuff
      in.close();
    }
    

    尽管如此 close() 应该用一个 finally 块。

    但上面的函数声明指出,此方法可以 IOException . 因为这是一个选中的异常,所以此函数的调用方需要 catch 它(或者声明它以便调用方能够处理它等等)。

        2
  •  2
  •   Tom Hawtin - tackline    15 年前

    Java的检查异常使程序员能够解决这样的问题。(我认为这是一件好事,即使在地毯下清理虫子更容易。)

    如果发生故障,您应该采取适当的措施。通常,处理应该位于与引发异常的不同层。

    应正确处理资源,其形式如下:

    acquire();
    try {
        use();
    } finally {
        release();
    }
    

    决不放 acquire() 在Try块中。不要把任何东西放在 获取() try (除了简单的分配)。不要试图在单个资源中释放多个资源 finally 块。

    所以,我们有两个不同的问题。不幸的是,Java语法混淆了这两种语法。编写此类代码的正确方法是:

    try {
        final FileOutputStream rawOut = new FileOutputStream(file);
        try {
            OutputStream out = new BufferedOutputStream(rawOut);
            ...
            out.flush();
        } finally {
            rawOut.close();
        }
    } catch (FileNotFoundException exc) {
        ...do something not being able to create file...
    } catch (IOException exc) {
        ...handle create file but borked - oops...
    }