노승현
예외처리 본문
예외와 오류의 차이
에러(Error)와 예외(Exception)는 프로그래밍에서 특정 문제 또는 오류를 나타내는 용어로 사용되지만, 그들 간에는 몇 가지 차이가 있습니다.
- 에러(Error):
- 에러는 프로그램이 실행 중에 발생하는 심각한 문제를 나타냅니다.
- 에러는 주로 컴파일 시간에 발생하며, 프로그램이 실행되기 전에 발견됩니다. 이러한 에러를 해결하지 않으면 프로그램은 실행되지 않습니다.
- 대표적인 예로는 구문 오류(Syntax Error)가 있습니다. 이는 프로그램 코드가 올바른 구문을 따르지 않을 때 발생합니다.
- 예외(Exception):
- 예외는 프로그램이 실행 중에 예측 가능한 문제 또는 상황을 나타냅니다. 예외는 프로그램이 실행되는 동안 발생하며, 발생한 예외에 대한 처리가 가능합니다.
- 대표적인 예로는 0으로 나누기, 파일을 찾을 수 없음 등의 상황이 있습니다.
- 예외는 예외 처리(Exception Handling)를 통해 프로그램이 예외 상황에 대해 대응할 수 있도록 합니다. 이를 통해 프로그램은 충돌하지 않고 계속 실행될 수 있습니다.
예외 클래스
NullPointerException(널 포인터 예외):
- NullPointerException은 참조형 변수가 null 값을 갖고 있는 상태에서 해당 변수를 사용하려고 할 때 발생하는 예외입니다.
- 예를 들어, 객체가 생성되지 않은 상태에서 객체의 메서드나 속성을 호출하려고 할 때 이 예외가 발생할 수 있습니다.
String str = null;
System.out.println(str.length()); // NullPointerException 발생
NumberFormatException(숫자 형식 예외):
- NumberFormatException은 문자열을 숫자로 변환할 때, 그 문자열이 숫자 형식이 아닌 경우 발생하는 예외입니다.
- 주로 Integer.parseInt(), Double.parseDouble() 등의 메서드에서 발생할 수 있습니다.
String str = "abc";
int num = Integer.parseInt(str); // NumberFormatException 발생
ArrayIndexOutOfBoundsException(배열 인덱스 범위 예외):
- ArrayIndexOutOfBoundsException은 배열에 접근할 때 유효하지 않은 인덱스를 사용했을 때 발생하는 예외입니다.
- 자바 배열의 인덱스는 0부터 시작하며, 배열의 길이를 초과하는 인덱스를 사용하면 이 예외가 발생합니다.
int[] arr = {1, 2, 3};
System.out.println(arr[3]); // ArrayIndexOutOfBoundsException 발생
try-catch
try-catch 구문은 프로그래밍에서 예외 처리를 구현하는 데 사용되는 구조입니다. 이 구문을 사용하면 예외가 발생할 수 있는 코드를 감싸고, 예외가 발생하면 적절한 대응을 할 수 있습니다. Java 언어에서 try-catch 구문은 다음과 같은 형태를 가지고 있습니다.
try {
// 예외가 발생할 수 있는 코드
} catch (ExceptionType1 e1) {
// ExceptionType1에 해당하는 예외를 처리하는 코드
} catch (ExceptionType2 e2) {
// ExceptionType2에 해당하는 예외를 처리하는 코드
} catch (Exception e) {
// 그 외의 예외를 처리하는 코드
} finally {
// 예외 발생 여부와 관계없이 항상 실행되는 코드 (선택적)
}
- try 블록: 예외가 발생할 수 있는 코드를 감싸는 블록입니다. 이 블록 안에서 예외가 발생하면 해당 예외를 처리하기 위해 catch 블록으로 이동합니다.
- catch 블록: try 블록에서 발생한 예외를 처리하는 블록입니다. 여러 개의 catch 블록이 있을 수 있으며, 각 블록은 특정 예외 타입에 대한 처리를 담당합니다. 예외 타입이 일치하는 catch 블록이 실행됩니다.
- finally 블록 (선택적): finally 블록은 예외 발생 여부와 관계없이 항상 실행되는 블록입니다. 주로 리소스의 정리나 마무리 작업을 위해 사용됩니다. finally 블록은 생략할 수 있습니다.
예를 들어, 다음은 파일을 열고 읽는 과정에서 발생할 수 있는 IOException을 처리하는 간단한 예제입니다.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderExample {
public static void main(String[] args) {
BufferedReader reader = null;
try {
// 파일을 열고 읽는 코드
reader = new BufferedReader(new FileReader("example.txt"));
String line = reader.readLine();
System.out.println("Read line: " + line);
} catch (IOException e) {
// IOException 처리 코드
System.err.println("Error reading the file: " + e.getMessage());
} finally {
// 파일을 열었으면 닫아주는 코드
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
// IOException 처리 코드
System.err.println("Error closing the file: " + e.getMessage());
}
}
}
}
다중catch
다중 catch는 하나의 try 블록에서 여러 종류의 예외를 처리하기 위해 사용되는 Java의 예외 처리 메커니즘입니다. 각 catch 블록은 특정한 예외 유형에 대한 예외 처리 코드를 포함하며, 발생한 예외가 어떤 유형인지에 따라 적절한 catch 블록이 실행됩니다.
다중 catch 구문의 일반적인 형태는 다음과 같습니다.
try {
// 예외가 발생할 수 있는 코드
} catch (ExceptionType1 e1) {
// ExceptionType1에 해당하는 예외를 처리하는 코드
} catch (ExceptionType2 e2) {
// ExceptionType2에 해당하는 예외를 처리하는 코드
} catch (ExceptionType3 e3) {
// ExceptionType3에 해당하는 예외를 처리하는 코드
} // ...
위의 예제에서 try 블록 안에서 예외가 발생하면 각 catch 블록은 발생한 예외의 유형을 확인하고, 해당하는 예외 타입에 대한 처리를 담당합니다. 하나의 try 블록에서 여러 개의 catch 블록을 사용하여 다양한 예외에 대응할 수 있습니다.
다중 catch를 사용하는 예시를 들어보겠습니다. 아래의 코드에서는 파일을 열고 읽는 과정에서 FileNotFoundException과 IOException을 다중 catch를 사용하여 처리합니다.
finally
finally 블록은 Java에서 예외 처리의 일부로 사용되는 특별한 블록으로, try 블록에서 예외가 발생하더라도 항상 실행되는 코드를 포함합니다. finally 블록은 선택적으로 사용될 수 있습니다.
finally 블록은 다음과 같은 기본 구조를 가지고 있습니다.
try {
// 예외가 발생할 수 있는 코드
} catch (ExceptionType e) {
// 예외 처리 코드
} finally {
// 예외 발생 여부와 관계없이 항상 실행되는 코드
}
finally 블록은 다음과 같은 역할을 합니다:
- 항상 실행되는 코드: finally 블록에 있는 코드는 예외가 발생하더라도 항상 실행됩니다. 이는 리소스의 해제나 정리 작업 등을 수행하는 데 사용됩니다.
- 예외 처리 완료 후 실행: finally 블록은 예외 처리 코드가 실행된 후에 실행됩니다. 즉, 예외 처리 코드가 실행된 이후에도 finally 블록의 코드가 실행되어 어떠한 상황에서도 마무리 작업이 보장됩니다.
- try-catch-finally 구조: try 블록에서 예외가 발생하면 예외 처리 코드가 실행되고, 그 후에 finally 블록의 코드가 실행됩니다.
예외 던지기
예외 던지기는 throws 키워드를 사용합니다. 메서드 뒤에 thorws 키워드를 사용하여 던지기 할 예외 객체를 붙여주면 됩니다. 예외 객체는 여러개를 던질 수 있으며, 여러 개를 던질 시에는 콤마(,)로 구분해서 나열해 줍니다.
'JAVA > Mentor JAVA' 카테고리의 다른 글
컬렉션 프레임워크 (0) | 2024.01.22 |
---|---|
API 클래스 (0) | 2024.01.19 |
내부 클래스 (0) | 2024.01.09 |
다형성과 타입 변화 (0) | 2024.01.06 |
상속이란? (0) | 2024.01.02 |