보고되지 않은 예외 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
와 같은 줄의 다음 텍스트를 큰따옴표(" "
)로 묶인 단어 업데이트됨
으로 바꿉니다.
마지막으로 두 파일(입력 및 출력)을 모두 닫습니다.
inputFile.close();
줄 위의 코드 예제에서 가리키고 있는 것은 포착하거나 던져야 하는 보고되지 않은 IOException
을 발생시키는 것입니다. 이것은 무엇을 의미 하는가?
inputFile.close();
를 의미합니다. try-catch
블록(예외 포착이라고 함) 또는 throws
키워드(예외가 throw됨)를 사용하여 제거할 수 있는 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
블록에 오류가 있는 경우 실행해야 하는 코드 블록을 정의할 수 있습니다. catch
는 try
블록 바로 뒤에 작성됩니다.
또한 각 try
블록에서 얻을 수 있는 예외 수에 따라 여러 개의 catch
블록을 가질 수 있습니다.
예외를 처리하는 동안 사용자 지정 메시지를 작성할 수도 있습니다. 이제 문제는 이러한 예외를 처리하는 방법입니다.
JVM(Java Virtual Machine)은 예외 처리 여부를 확인합니다. 그렇지 않은 경우 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!");
이것이 선언된 예외를 처리하는 이유입니다. 프로그래머가 코드 내에서 확인되지 않은 예외를 처리할 수 있기 때문에 확인된
예외만 선언할 수 있음을 기억하십시오.