💡 예외처리(Exception Handling) - 프로그램의 실행 도중에 발생할 수 있는 오류나 예기치 않은 상황에 대한 대비를 위해 코드를 작성하는 것을 의미합니다. - 이를 통해 실행 중인 프로그램의 갑작스러운 비정상 종료를 방지하고 정상적인 실행 상태를 유지할 수 있도록 하는 목적이 있습니다.
1. 확인된 예외(Checked Exception) - 컴파일러가 강제로 처리하도록 하는 예외를 의미합니다. - try-catch 블록이나 throws 키워드를 사용하여 명시적으로 처리해야 합니다. - 주로 입출력, 네트워크 연결 등의 외부 리소스와 관련된 예외가 여기에 해당합니다.
2. 확인되지 않은 예외(Unchecked Exception) - 개발자의 실수나 예상치 못한 상황 등으로 발생하는 예외를 의미합니다. - 컴파일러가 강제로 처리하지 않으며, 예외가 발생하면 프로그램이 중단됩니다. - 주로 배열 인덱스 오류, 널 포인터 오류 등의 런타임 에러가 여기에 해당합니다.
💡 확인된 예외 처리(Checked Exception) : try-catch, throws - 컴파일 시점에서 확인되는 에러이며 개발자가 이를 처리하지 않으면 컴파일 오류가 발생합니다. - 외부 리소스와 상호작용하는 작업에서 발생할 수 있는 예외로 파일 입출력, 네트워크 통신 등이 대표적인 예입니다.
💡 사용 예시
- 아래에서는 JSON 데이터를 파싱 하는 예시를 보여주는 예시입니다. - 해당 파싱 과정에서 컴파일 단계에서 ParseException 오류가 발생할 수 있음을 알려주고 있습니다. 이렇게 컴파일 시점에 발생하는 오류를 ‘확인된 오류 처리’라고 합니다.
publicvoidjsonParserExample() {
String jsonString = "{\\" name\\":\\" John\\", \\" age\\":30, \\" city\\":\\" New York\\"}";
JSONParser parser = new JSONParser();
JSONObject jsonObject = (JSONObject) parser.parse(jsonString);
String name = (String) jsonObject.get("name");
long age = (Long) jsonObject.get("age");
String city = (String) jsonObject.get("city");
}
- 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것을 의미합니다.
try - catch - finally
설명
try 블록
예외를 발생시킬 수 있는 코드를 포함하고 있습니다.
catch 블록
예외의 종류를 지정하고 특정 예외가 발생하였을 때 실행될 코드를 포함하고 있습니다.
finally 블록
선택적으로 사용되며, 예외가 발생했는지 여부에 상관없이 실행될 코드를 포함하고 있습니다.
1.1. 기본구조와 예시
💡 try - catch - finally 기본 구조
// 예외가 발생할 수 있는 코드try {
//
}
// 예외 처리 코드 -1catch (IndexOutOfBoundsException e) {
//
}
// (선택) 예외 처리 코드 -2catch (ParseException e) {
//
}
// 항상 실행되는 코드finally {
//
}
💡 Exception으로 모든 에러를 잡아도 되지 않을까? - 모든 에러를 잡기 위해 Exception을 사용하는 것은 일반적으로 권장되지 않습니다. - 모든 예외를 잡으려면 특정 유형의 오류를 식별하고 처리하기가 어려워져 코드에서 잠재적인 문제와 예기치 않는 동작이 발생할 수 있습니다. - 일방적으로 예상하는 특정 예외를 잡고 해당 예외를 적절히 처리하는 것이 더 좋습니다.
💡 사용예시 -1
- 일괄적으로 Exception을 처리하는 예시
/**
* 일괄 Exception으로 처리하는 방법
*/// 예외가 발생할 수 있는 코드try {
}
// 일괄 예외처리 코드catch (Exception e) {
}
💡 사용예시 -2
- 세부적으로 Exception을 처리하는 예시
/**
* 세부적으로 예외 처리를 하는 방법
*/// 예외가 발생할 수 있는 코드try {
//
}
// 예외 처리 코드 -1catch (IndexOutOfBoundsException e) {
//
}
// (선택) 예외 처리 코드 -2catch (ParseException e) {
//
}
- RuntimeException 클래스의 하위 클래스로 분류되며 개발자가 강제로 예외처리를 수행해야 합니다. - 이러한 예외처리는 개발자가 예외처리를 하지 않고 무시할 수 있으나 실행 시 예외가 발생할 수 있으며 예외가 처리되지 않을 경우 프로그램의 비정상적인 동작을 초래 할 수 있습니다.
💡 예외 처리 복구(Exception Handling and Recovery) - 예외 상황을 처리하고, 정상적인 실행 흐름으로 복귀하는 방법을 의미합니다. - 예외가 발생했을 때 해당 예외를 처리하고 문제를 해결하여 프로그램의 실행을 계속할 수 있도록 합니다.
💡 예외 처리 예시
- try 블록을 사용하여 예외가 발생할 수 있는 코드를 포함하고 있습니다.
- 코드는 FileReader 객체를 사용하여 파일을 읽으려고 시도합니다. 파일이 찾을 수 없는 경우(FileNotFoundException) 해당 예외 유형의 catch 블록이 실행되고 파일을 찾을 수 없다는 메시지가 출력됩니다. - 파일을 읽는 도중에 오류가 발생한 경우(IOException), IOException에 대한 catch 블록이 실행되고, 파일을 읽는 도중에 오류가 발생했다는 메시지가 출력됩니다.
try {
FileReader fileReader = new FileReader("file.txt");
// 파일을 읽는 작업
fileReader.close();
} catch (FileNotFoundException e) {
System.out.println("파일을 찾을 수 없습니다.");
} catch (IOException e) {
System.out.println("파일을 읽는 도중에 오류가 발생했습니다.");
}
💡 예외 처리 회피(Exception Handling and Avoidance) - 예외가 발생할 수 있는 상황을 사전에 예방하거나 회피하는 방법입니다. - 이는 예외를 발생시키는 코드를 변경하거나 예외가 발생할 가능성이 있는 조건을 사전에 체크하여 예외가 발생하지 않도록 합니다.
💡 예외 처리 예시
- 사전에 예외가 발생할 수 있는 input 변수가 null이 아니고 비어있지 않은지 확인합니다. - 그렇지 않을 경우, "올바른 형식의 입력을 제공해 주세요."라는 메시지가 출력됩니다.
if (input != null && !input.isEmpty()) {
// 유효한 입력 처리
} else {
System.out.println("올바른 형식의 입력을 제공해주세요.");
}