未報告の例外 IOException を解決する Java でスローされるようにキャッチまたは宣言する必要がある
-
報告されない
IOException
のデモンストレーション -
try-catch
を使用して、報告されていないIOException
をキャッチする -
throws
キーワードを使用してIOException
を根絶する
このチュートリアルでは、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!
上記のような出力が表示されます。 例外を処理したため、プログラムはコードの実行を続行します。
ここで、次のように try
、catch
、および 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
例外のみを宣言できることを思い出してください。これは、プログラマーがコード内で未チェックの例外を処理できるためです。