코린이
혼공자 chapter10 예외 처리 본문
10_1 예외 클래스
예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 뜻한다.
(예외는 예외 처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있다.)
자바에서 예외가 발생할 가능성이 높은 코드를 컴파일할 때 예외 처리 유무를 확인한다.
예외와 예외 클래스
예외에는 두 가지 종류(일반 예외, 실행 예외)가 있다.
- 일반 예외: 컴파일 체크 예외라고도 한다. 프로그램 실행에서 예외 발생이 높아 컴파일하는 과정에서 예외 처리 코드가 있는지 검사
- 실행 예외: 실행 시 예측할 수 없이 갑자기 발생해 컴파일 과정에서 예외 처리 코드가 있는지 검사하지 않는다.
- 자바에서는 예외를 클래스로 관리해 JVM은 프로그램 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성 후 예외 처리 코드에서 예외 객체를 이용할 수 있게 해 준다.
실행 예외
자바 컴파일러가 체크하지 않아 개발자의 경험에 의해 예외 처리 코드를 작성
NullPointerException
자바에서 빈번하게 발생하는 실행 예외
package week10;
public class NullPointerException {
public static void main(String[] args) {
String data = null;
System.out.println(data.toString());
}
}
null 값을 갖는 참조 변수로 객체 접근 연산자 도트 .를 사용할 때 발생
이외에도 ArrayIndexOutofBoundsException, NumberFormantException, ClassCastException 예외처리가 있다.
10_2 예외 처리
자바 컴파일러는 소스 파일을 컴파일할 때 일반 예외가 발생할 가능성이 있는 코드를 발견하면 컴파일 에러를 발생시켜 개발자가 강제로 예외 처리 코드를 요구한다.
예외 처리 코드
try-catch-finally
생성자 내부와 메소드 내부에서 작성되어 일반 예외와 실행 예외가 발생할 경우 예외 처리를 할 수 있도록 해준다.
- 이미지 참조
출처: https://howtodoinjava.com/java/exception-handling/try-catch-finally/
다중 catch
try 내부에는 다양한 예외가 발생할 수 있어 예외 처리 코드를 전부 다르게 하려면 다중 catch 블록을 작성해야 한다.
try 블록에서 해당 타입의 예외가 발생하면 catch 블록을 실행하도록 되어 있다.
catch가 여러 개라 해도 하나의 catch 블록만 실행한다.
그 이유는 try 블록에서 동시 다발적으로 예외가 발생하지 않고, 하나의 예외가 발생하면 즉시 실행을 멈춰 catch 블록으로 이동한다.
package week10;
public class MultiCatchExample {
public static void main(String[] args) {
try {
int[] numbers = {1, 2, 3};
int index = 4;
//배열 인덱스를 벗어나는 예외(IndexOutOfBoundsException)를 발생
int result = numbers[index];
//숫자로 변환할 수 없는 문자열을 숫자로 변환하려 할 때 예외(NumberFormatException)를 발생
String nonNumericString = "ABC";
int numericValue = Integer.parseInt(nonNumericString);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("배열 인덱스를 벗어났습니다.");
} catch (NumberFormatException e) {
System.out.println("숫자로 변환할 수 없는 문자열입니다.");
} catch (Exception e) {
System.out.println("일반 예외가 발생했습니다.");
}
System.out.println("프로그램 종료");
}
}
NumberFormatException 예외를 추가하여 문자열 "ABC"를 숫자로 변환하는 과정에서 발생하는 예외를 처리합니다. 이제 코드를 실행하면 **NumberFormatException**에 대한 catch 블록이 실행되는 것을 확인할 수 있다.
catch 순서
try 블록에 ArrayIndexOutofBoundsException이 발생하면 첫 번째 catch 블록을 실행하고, 다른 예외가 발생하면 두 번째 catch 블록을 실행한다.
예외 떠넘기기
메소드를 호출한 곳으로 예외를 떠넘길 수 있다. 이때 사용하는 키워드가 throw 키워드로 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 한다.
리턴타입 메소드이름(매개변수,...) throws 예외클래스1, 예외클래스2, ... {}
리턴타입 메소드이름(매개변수,...) throws Exception{}
throw 키워드가 붙어 있는 메소드는 반드시 try블록 내에서 호출하여야 한다.
package week10;
public class ThrowExample {
public static void main(String[] args) {
try{
findClass();
} catch (ClassNotFoundException e){
System.out.println("클래스가 존재하지 않습니다.");
}
}
public static void findClass() throws ClassNotFoundException{
Class clazz = Class.forName("java.lang.String2");
}
}
예외를 직접 발생시키는 throw 예약어를 사용하는 간단한 예시로 위의 코드는 findClass() 메서드에서 **ClassNotFoundException**을 발생시키고, 호출한 쪽인 main() 메서드에서 이 예외를 처리하는 것을 보여준다. throws 키워드를 사용하여 예외를 전파하고, catch 블록을 사용하여 예외를 처리하는 것이 Java에서 예외 처리 메커니즘의 기본적인 방법이다.
'자바 > 혼공 학습단 10기' 카테고리의 다른 글
혼공단 3주차 미션 (0) | 2023.07.23 |
---|---|
혼공자 Chapter11 API (0) | 2023.07.21 |
혼공자 chapter08 인터페이스 (0) | 2023.07.15 |
혼공자 Chapter07. 상속 (0) | 2023.07.14 |
혼공자 2주차 미션 (0) | 2023.07.14 |