1. ホーム
  2. java

[解決済み] Java未報告例外

2022-02-01 02:47:39

質問内容

Javaを学習していると、よくこのようなエラーに出くわします。それは次のようなものです。

未報告の例外 java.io.FileNotFound 例外; キャッチするか、スローされるように宣言する必要があります。

java.io.FileNotFoundはほんの一例で、いろいろなものを見てきました。この特定のケースでは、エラーを引き起こすコードは次のとおりです。

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

try/catchブロックの中にステートメントを入れると、エラーは常に消え、コードは正常にコンパイル&実行されます。それで十分な時もありますが、そうでない時もあります。

まず、私が学んでいる例では、try/catchは必ずしも使われておらず、それでも動作するはずです。

さらに重要なのは、コード全体をtry/catchの中に入れると、全く動作しないことがあることです。例えば、この特別なケースでは、私は次のようにする必要があります。 out.close()です。 finally{ }. ブロックの中にありますが、もし上の文自体が try{ }. , finally{} は、"see" アウト となり、閉じることができません。

最初に考えたのは java.io.FileNotFoundをインポートします。 または他の関連する例外がありますが、それは助けられませんでした。

どうすればいいですか?

あなたが言っているのは チェック済み例外 つまり、宣言するか、処理する必要があります。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 を宣言し、呼び出し元がそれに対処できるようにする、など)。