Java 개발자는 Java 예외 및 예외 처리에 대해 잘 알고 있어야 합니다.
이 튜토리얼은 모든 프로그래머가 Java 프로그램으로 작업할 때 가지고 있어야 하는 기본 지식을 제공합니다. 시작하려면 Java 예외가 정확히 무엇인지 이해하는 것으로 시작하겠습니다.
자바 예외란 무엇입니까
Java 프로그램은 실행 중에 프로그램이 갑자기 종료되는 문제를 일으킬 수 있습니다. 이러한 문제를 예외라고 합니다.
훌륭한 프로그래머는 실행 중에 발생할 수 있는 오류를 인식하고 이러한 예외가 발생한 경우 프로그램이 취할 대체 경로를 제공할 수 있어야 합니다. 이 관행을 예외 처리라고 합니다.
이제 예외 처리가 왜 필요한지 궁금할 것입니다. 예외를 발생시키지 않는 프로그램을 작성하지 않는 이유는 무엇입니까?
예외 처리가 필요한 이유
결과적으로 예외가 발생하지 않는 프로그램을 작성하는 것은 말처럼 쉽지 않습니다. 대부분의 경우 이러한 피할 수 없는 오류는 프로그래머가 제어할 수 없습니다.
사용자 입력을 허용하는 프로그램은 사용자가 제공한 잘못된 입력으로 인해 예외가 발생하기 쉽습니다. 프로그래머가 모르는 사이에 외부 소스에 의해 이동, 이름 변경 또는 삭제되었을 가능성을 고려하여 외부 파일을 읽는 것도 마찬가지입니다.
이러한 경우 프로그램은 실행을 종료하지 않고 예외를 정상적으로 처리할 수 있어야 합니다.
자바 예외 계층
Java의 모든 예외는 Exception
의 자식이어야 합니다. 그 자체가 Throwable
의 자식인 클래스 수업.
Exception
의 두 가지 주요 하위 클래스 클래스는 RuntimeException
입니다. 및 IOExceptions
.
예외 대 오류
Throwable
의 또 다른 자식 클래스 클래스는 Error
입니다. 수업. 그러나 오류는 예외와 다릅니다.
오류는 JVM이 실행 중에 발생할 수 있는 문제를 나타냅니다. 이러한 문제는 일반적으로 치명적이며 복구할 수 없습니다. 메모리 누수 및 라이브러리 비호환성 문제는 프로그램 오류의 일반적인 원인입니다.
StackOverflowError
및 OutOfMemoryError
Java 오류의 두 가지 예입니다.
확인 및 확인되지 않은 예외
Java 예외를 확인됨의 두 가지 주요 범주로 나눌 수 있습니다. 및 선택 해제 예외.
확인된 예외는 컴파일하기 전에 프로그램에서 처리해야 하는 예외입니다. 이러한 예외가 처리되지 않으면 프로그램은 Java 컴파일러에서 컴파일되지 않습니다. 따라서 컴파일 타임 예외라고도 합니다. IOExceptions
확인된 예외의 좋은 예입니다.
확인되지 않은 예외는 프로그램을 컴파일할 때 컴파일러가 무시하는 예외입니다. 프로그램에서 이러한 예외를 처리했는지 여부는 프로그램이 컴파일될 때 중요하지 않습니다. 예외 처리는 이러한 예외에 부과되지 않으므로 우리 프로그램은 RuntimeExceptions
를 실행할 수 있습니다. 그 결과 프로그램이 종료됩니다.
RuntimeException
을 확장하는 모든 클래스 클래스는 확인되지 않은 예외입니다. 이러한 클래스의 두 가지 예는 NullPointerException
입니다. 및 ArrayIndexOutOfBoundsException
.
예외 클래스에서 일반적으로 사용되는 메서드
Java Exception
에서 일반적으로 사용되는 몇 가지 메서드를 살펴보겠습니다. 클래스:
getMessage
:발생한 예외에 대한 세부 정보가 포함된 메시지를 반환합니다.printStackTrace
:예외가 발생한 스택 추적을 반환합니다.toString
:클래스 이름과getMessage
로 반환되는 메시지를 반환합니다. 방법.
예외 처리 방법
Java에서 예외를 처리하는 방법을 살펴보겠습니다.
시도 캐치
try-catch를 사용하여 예외를 포착하고 적절하게 처리할 수 있습니다. 자바에서 차단합니다.
이 구문에서 예외를 던지기 쉬운 코드 부분은 try 블록 안에 배치되고 catch 블록은 던져진 예외/예외를 포착하고 우리가 제공하는 로직에 따라 처리합니다.
try-catch 블록의 기본 구문은 다음과 같습니다.
try {
//exception-prone code
}
catch(Exception e) {
//error handling logic
}
이 접근 방식을 사용하면 프로그램에서 예외가 throw될 때 프로그램이 실행을 중지하지 않고 대신 정상적으로 처리됩니다.
IOExceptions
를 처리하는 방법을 살펴보겠습니다. FileReader
에 의해 발생 Java 프로그램의 클래스입니다.
예:
import java.io.FileReader;
public class TryCatchBlockExample {
public static void main(String[] args) {
try {
FileReader file = new FileReader("source.txt");
file.read();
}
catch(Exception e) {
e.printStackTrace();
}
}
}
여기에서는 단일 catch 블록을 사용하여 FileNotFoundException
을 처리했습니다. FileReader
를 인스턴스화할 때 발생 클래스 및 IOExceptions
read()
에 의해 발생 FileReader
메소드 수업.
이 두 예외는 모두 Exception
의 자식입니다. 수업.
또한 여러 catch 문을 사용하여 단일 try 문 내에서 코드에서 발생하는 다양한 유형의 오류를 잡을 수 있습니다. 이전 예의 경우 하나의 catch 블록을 사용하여 FileNotFoundException
을 잡을 수 있습니다. IOExceptions
에 대한 또 다른 catch 블록 다음 코드 스니펫에서 볼 수 있듯이:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class TryCatchBlockExample {
public static void main(String[] args) {
try {
FileReader file = new FileReader("source.txt");
file.read();
file.close();
}
catch(FileNotFoundException e) {
e.printStackTrace();
}
catch(IOException e) {
e.printStackTrace();
}
}
}
던져진 예외가 첫 번째 catch 문에서 처리한 예외와 일치하면 첫 번째 catch 문 내부의 논리에 의해 처리됩니다.
예외가 일치하지 않으면 두 번째 catch 문으로 전달됩니다. catch 문이 세 개 이상 있는 경우 이 프로세스는 예외가 해당 유형을 catch하는 catch 문에 도달할 때까지 계속됩니다.
FileNotFoundException
이후 IOExceptions
의 하위 유형입니다. , 두 번째 catch 문을 사용하여 FileNotFoundException
잡기 작동하지 않습니다. 첫 번째 catch 문에 의해 처리되며 두 번째 문에는 도달하지 않습니다.
마침내
try-catch를 사용할 때 우리 프로그램에서 예외를 포착하기 위해 블록을 사용하는 경우 예외가 포착되었는지 여부에도 불구하고 일부 논리를 구현하려는 인스턴스가 있습니다. 이러한 경우 try-catch-finally를 사용할 수 있습니다. try-catch 대신 차단 차단합니다.
그런 다음 finally
내부의 코드 문은 예외가 발생하는지 여부에 관계없이 구현됩니다. finally
문은 항상 try-catch-finally 블록 끝에 와야 합니다.
예를 들어 FileReader
를 사용할 때 클래스가 파일을 읽기 위해서는 예외 발생 여부에 관계없이 처리가 끝나면 열린 파일을 닫아야 합니다. 이를 보장하기 위해 finally
안에 파일을 닫는 코드를 배치할 수 있습니다. 성명서.
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class TryCatchFinallyBlockExample {
public static void main(String[] args) {
FileReader file = null;
try {
file = new FileReader("source.txt");
file.read();
}
catch(FileNotFoundException e) {
e.printStackTrace();
}
catch(IOException e) {
e.printStackTrace();
}
finally {
file.close();
}
}
}
그러나 위의 코드를 컴파일하려고 하면 처리되지 않은 IOExceptions
으로 인해 코드가 컴파일되지 않습니다. . close()
때문입니다. FileReader
메소드 클래스는 IOExceptions
을 던질 수도 있습니다. . 따라서 이 부분을 다음과 같은 다른 try 블록 안에 배치해야 합니다.
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class TryCatchFinallyBlockExample {
public static void main(String[] args) {
FileReader file = null;
try {
file = new FileReader("source.txt");
file.read();
}
catch(FileNotFoundException e) {
e.printStackTrace();
}
catch(IOException e) {
e.printStackTrace();
}
finally {
try {
file.close();
}
catch(IOException e) {
e.printStackTrace();
}
}
}
}
던짐
throws
를 사용한 오류 처리 Java의 키워드는 간단합니다. 사실, 이 접근 방식에서는 예외가 발생한 장소에서 실제로 예외를 처리하지 않습니다. 대신 현재 메서드를 호출한 메서드에 대해 현재 메서드에서 예외를 throw합니다. 그러면 오류 처리는 외부 메소드의 책임이 됩니다.
메서드에서 예외를 throw하려면 이 메서드가 고려된 예외를 throw할 수 있다고 선언하기만 하면 됩니다. IOExceptions
를 처리하는 방법을 살펴보겠습니다. FileReader
에 의해 발생 이 접근 방식을 사용하여 수업을 진행합니다.
예:
import java.io.FileReader;
import java.io.IOException;
public class ThrowsExample {
public void readFile throws IOException {
FileReader file = new FileReader("source.txt");
file.read();
file.close();
}
}
던짐
이 목록의 다른 접근 방식과 달리 throw
키워드는 오류를 처리하는 데 사용되지 않습니다. 하지만 대부분의 사람들이 throw
를 혼동하기 때문에 throws
가 있는 키워드 키워드, 우리는 여기에서 논의하는 것이 가장 좋을 것이라고 생각했습니다.
throw
키워드는 예외를 명시적으로 호출하는 데 사용됩니다. 새로 인스턴스화된 예외 또는 메서드 내에서 포착된 예외를 throw할 수 있습니다.
public class ThrowExample {
public void invalidate(int amount) throws Exception {
if (amount < 500) {
throw new Exception("Amount not sufficient");
}
}
}
사용자 정의 예외
기본 제공 Java 예외를 사용하는 것 외에도 고유한 예외를 정의할 수 있습니다. 확인 또는 확인되지 않은 예외로 정의할 수 있습니다. 새로운 확인된 예외를 생성하려면 새 예외가 Exception
을 확장해야 합니다. 수업.
선택되지 않은 만들기 예외, RuntimeException
확장 수업.
다음 코드 예제에서는 사용자 정의 확인된 예외를 만들었습니다.
public class InvalidLengthException extends Exception {
private int length;
private String message;
public InvalidLengthException(int length, String message) {
this.length=length;
this.message=message;
}
public int getAmount() {
return this.length;
}
public String getMessage() {
return this.message;
}
}
이제 다음과 같이 프로그램 로직 내에서 위의 예외를 사용할 수 있습니다.
public class InputChecker {
private int minLength;
private int maxLength;
public InputChecker(int minLength, int maxLength) {
this.minLength=minLength;
this.maxLength=maxLength;
}
public void checkStringLength(String strInput) throws InvalidLengthException {
int strLength = strInput.length();
if (strLength < minLength) {
throw new InvalidLengthException(strLength, "Input should have minimum "+minLength+" characters");
}
else if (strLength > maxLength){
throw new InvalidLengthException(strLength, "Input should have maximum "+maxLength+" character");
}
}
}
InputChecker
를 사용하여 문자열의 길이를 확인하면 클래스에서 InvalidLengthException
이 발생합니다. 문자열 길이가 최소 길이보다 작거나 최대 길이보다 큰 경우.
public class Main {
public static void main(String[] args) {
InputChecker ic = new InputChecker(2, 7);
try {
ic.checkStringLength("longer than the maximum length");
}
catch(InvalidLengthException e) {
e.printStackTrace();
}
}
}
위의 코드 조각을 실행하면 InvalidLengthException
이 발생합니다. 그러면 다음과 같은 결과가 나타납니다.
InvalidLengthException: Input should have maximum 7 character
at InputChecker.checkStringLength(InputChecker.java:17)
at Main.main(Main.java:6)
결론
이 자습서에서는 Java 예외에 대한 빠르고 간결한 소개를 제공했습니다. 이제 예외가 무엇이며 Java 프로그램에서 예외를 처리하는 방법을 충분히 이해하셨기를 바랍니다.