未報告の例外 IOException を解決する Java でスローされるようにキャッチまたは宣言する必要がある

Mehvish Ashiq 2023年10月12日
  1. 報告されない IOException のデモンストレーション
  2. try-catch を使用して、報告されていない IOException をキャッチする
  3. throws キーワードを使用して IOException を根絶する
未報告の例外 IOException を解決する Java でスローされるようにキャッチまたは宣言する必要がある

このチュートリアルでは、unreported exception ioexception; キャッチするか、スローするように宣言する必要があります. また、サンプルプログラムを通じて考えられる原因と解決策についても学びます。

報告されない IOException のデモンストレーション

コード例:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class TestClass {
  public static void main(String[] args) {
    BufferedReader inputFile = null;
    PrintWriter outputFile = null;
    String inputFileName = "C:\\New folder\\inputFile.txt";
    String outputFileName = "C:\\New folder\\outputFile.txt";
    try {
      inputFile = new BufferedReader(new FileReader(inputFileName));
      outputFile = new PrintWriter(new FileWriter(outputFileName));
      String lineOfText = inputFile.readLine();
      while (lineOfText != null) {
        if (lineOfText.contains("x")) {
          lineOfText = lineOfText.replaceAll("x"
                  + ".*",
              "\"Updated\"");
        }
        outputFile.println(lineOfText);
        lineOfText = inputFile.readLine();
      }
    } catch (IOException ioe) {
      System.err.println("Caught IOException: " + ioe.getMessage());
    } finally {
      if (inputFile != null) {
        inputFile.close(); //<------This line causes this exception
      }
      if (outputFile != null) {
        outputFile.close();
      }
    }
  }
}

上記のコードでは、指定された入力ファイルからデータを読み取ります。 x という文字を探します。 見つかったらすぐに、同じ行の x と次のテキストを、二重引用符 (" ") で囲まれた Updated という単語に置き換えます。

最後に、両方のファイル (入力と出力) を閉じます。

inputFile.close(); 上記のコード例で指摘しているのは、キャッチまたはスローする必要がある未報告の IOException を引き起こしていることです。 これは何を意味するのでしょうか?

inputFile.close(); という意味です。 try-catch ブロック (例外のキャッチと呼ばれます) または throws キーワード (例外がスローされると呼ばれます) を使用して取り除くことができる IOException を引き起こしています。 どうやってするの?

以下のコード例で学びましょう。

try-catch を使用して、報告されていない IOException をキャッチする

コード例:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class TestClass {
  public static void main(String[] args) {
    BufferedReader inputFile = null;
    PrintWriter outputFile = null;
    String inputFileName = "C:\\New folder\\inputFile.txt";
    String outputFileName = "C:\\New folder\\outputFile.txt";
    try {
      inputFile = new BufferedReader(new FileReader(inputFileName));
      outputFile = new PrintWriter(new FileWriter(outputFileName));
      String lineOfText = inputFile.readLine();
      while (lineOfText != null) {
        if (lineOfText.contains("x")) {
          lineOfText = lineOfText.replaceAll("x"
                  + ".*",
              "\"Updated\"");
        }
        outputFile.println(lineOfText);
        lineOfText = inputFile.readLine();
      }
    } catch (IOException ioe) {
      System.err.println("Caught IOException: " + ioe.getMessage());
    } finally {
      if (inputFile != null) {
        try {
          inputFile.close();
        } catch (IOException ioe) {
          System.err.println("Caught IOException: " + ioe.getMessage());
        }
      }
      if (outputFile != null) {
        outputFile.close();
      }
    }
  }
}

入力ファイルは以下の内容です。

this is x one file
this is x two file
this is x three file

プログラムを実行すると、以下の内容を含む出力ファイルが得られます。

this is "Updated"
this is "Updated"
this is "Updated"

ここでは、try-catch ブロックを使用して IOException を排除します。ここで、try ステートメントにより、実行プロセス中にエラーを検査する必要があるコードの特定のブロックを定義できます。

try ブロック内の特定のステートメントで例外が発生すると、実行が停止し、catch ブロックにジャンプします。 そのため、例外をスローしない try ブロック内にコードを保持しないことを強くお勧めします。

一方、catch ステートメントでは、try ブロックでエラーが発生した場合に実行する必要があるコード ブロックを定義できます。 try ブロックの直後に catch を記述します。

それぞれの try ブロックで取得できる例外の数に基づいて、複数の catch ブロックを持つこともできます。

例外の処理中にカスタマイズされたメッセージを書くこともできます。 さて、問題はこれらの例外をどのように処理するかです。

Java 仮想マシン (JVM) は、例外が処理されるかどうかをチェックします。 そうでない場合、JVM はデフォルトの例外ハンドラーを提供し、以下にリストされているいくつかのタスクを実行します。

  • プログラムの出力コンソールに例外の説明を出力します。
  • また、プログラムの出力コンソールにスタック トレースを出力します。 スタック トレースは、例外が発生したメソッドの階層です。
  • プログラムの終了につながります。

一方、アプリケーション プログラマが例外を処理した場合、アプリケーションの通常のフローは維持されます。つまり、残りのコードが実行されます。

throws キーワードを使用して IOException を根絶する

コード例:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class TestClass {
  public static void main(String[] args) throws IOException {
    BufferedReader inputFile = null;
    PrintWriter outputFile = null;
    String inputFileName = "C:\\New folder\\inputFile.txt";
    String outputFileName = "C:\\New folder\\outputFile.txt";
    try {
      inputFile = new BufferedReader(new FileReader(inputFileName));
      outputFile = new PrintWriter(new FileWriter(outputFileName));
      String lineOfText = inputFile.readLine();
      while (lineOfText != null) {
        if (lineOfText.contains("x")) {
          lineOfText = lineOfText.replaceAll("x"
                  + ".*",
              "\"Updated\"");
        }
        outputFile.println(lineOfText);
        lineOfText = inputFile.readLine();
      }
    } catch (IOException ioe) {
      System.err.println("Caught IOException: " + ioe.getMessage());
    } finally {
      if (inputFile != null) {
        inputFile.close();
      }
      if (outputFile != null) {
        outputFile.close();
      }
    }
  }
}

入力ファイルの内容は以下の通りです。

this is x one file
this is x two file
this is x three file

出力ファイルの内容は、以下のように更新されています。

this is "Updated"
this is "Updated"
this is "Updated"

このコードは、try-catch ブロックのみを使用して例外を処理する前のセクションと同じです。 ここでは、throws を使用して例外を宣言しています。 コンマ (,) で区切られた複数の例外を宣言することもできます。

throws キーワードは、このメソッドで例外が発生する可能性があることをアプリケーション プログラマに通知します。 throws キーワードは、関数を定義するときに記述されることに注意してください (指定されたコード例を参照)。

したがって、通常の実行フローを維持するために、プログラマーがコード内でこの例外を処理することを強くお勧めします。 そうしないと、プログラムが終了します。 サンプルコードで理解しましょう。

次のコードをコピーして実行します。 入力ファイルのパスが正しくないことを確認してください。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class TestClass {
  public static void main(String[] args) throws IOException {
    BufferedReader inputFile = null;
    PrintWriter outputFile = null;
    String inputFileName = "C:\\New folder\\input.txt";
    String outputFileName = "C:\\New folder\\outputFile.txt";
    try {
      inputFile = new BufferedReader(new FileReader(inputFileName));
      outputFile = new PrintWriter(new FileWriter(outputFileName));
      String lineOfText = inputFile.readLine();
      while (lineOfText != null) {
        if (lineOfText.contains("x")) {
          lineOfText = lineOfText.replaceAll("x"
                  + ".*",
              "\"Updated\"");
        }
        outputFile.println(lineOfText);
        lineOfText = inputFile.readLine();
      }
    } catch (IOException ioe) {
      System.err.println("Caught IOException: " + ioe.getMessage());
    } finally {
      if (inputFile != null) {
        inputFile.close();
      }
      if (outputFile != null) {
        outputFile.close();
      }
    }
    System.out.println("Continue execution!");
  }
}

出力:

Caught IOException: C:\New folder\input.txt (The system cannot find the file specified)
Continue execution!

上記のような出力が表示されます。 例外を処理したため、プログラムはコードの実行を続行します。

ここで、次のように trycatch、および finally ブロックをコメントアウトして、コードを再実行します。 入力ファイルのパスが正しくないことを確認してください。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class TestClass {
  public static void main(String[] args) throws IOException {
    BufferedReader inputFile = null;
    PrintWriter outputFile = null;
    String inputFileName = "C:\\New folder\\input.txt";
    String outputFileName = "C:\\New folder\\outputFile.txt";
    // try {
    inputFile = new BufferedReader(new FileReader(inputFileName));
    outputFile = new PrintWriter(new FileWriter(outputFileName));
    String lineOfText = inputFile.readLine();
    while (lineOfText != null) {
      if (lineOfText.contains("x")) {
        lineOfText = lineOfText.replaceAll("x"
                + ".*",
            "\"Updated\"");
      }
      outputFile.println(lineOfText);
      lineOfText = inputFile.readLine();
    }
    //} catch (IOException ioe) {
    //    System.err.println("Caught IOException: " + ioe.getMessage());
    //} finally {
    if (inputFile != null) {
      inputFile.close();
    }
    if (outputFile != null) {
      outputFile.close();
    }
    //}
    System.out.println("Continue execution!");
  }
}

プログラムは例外を見つけるとすぐに実行を終了し、次のコード行に到達することはありません。

System.out.println("Continue execution!");

これが、宣言された例外を処理する理由です。 checked 例外のみを宣言できることを思い出してください。これは、プログラマーがコード内で未チェックの例外を処理できるためです。

著者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

関連記事 - Java Error