Java
[Java] Exception
wwxs
2024. 9. 10. 17:47
Exception (예외)
- 프로그램 실행 중에 발생할 수 있는 예기치 못한 문제나 조건
예외 처리
- 예외가 발생할 경우 프로그램이 중단되지 않고 대응하여 정상적인 흐름을 유지하는 프로그래밍 기법
자바 예외 클래스
- Throwable: 모든 예외와 오류의 최상위 클래스
- 모든 예외 클래스는 해당 클래스를 상속받음
- 예외와 관련된 메시지, 처리 방법에 대한 예시 정보를 포함
1) Exception(예외)
- 프로그램이 처리할 수 있는 예외들의 클래스
- 예외 처리를 통해 개발자가 처리할 수 있는 문제들을 정의
1-1) Checked Exception
- 컴파일 시점에 체크되는 예외
- 개발자가 반드시 처리
- 컴파일러는 해당 예외가 처리되어 있지 않을 경우 오류를 발생
1-2) Runtime (Unchecked) Exception
- 런타임 시점에 발생되는 예외
- 개발자의 실수로 발생
- 컴파일러가 강제하지 못함 (체크하지 못한다.)
2) Error (오류): 시스템 레벨에서 발생하는 예외, 개발자가 처리할 수 없다
ex) 메모리 부족, 네트워크 연결 등
자바 예외 처리 방법
- try-catch 블럭
- throws 키워드
- 사용자 정의 예외
(예제 코드)
더보기
(try-cath 블록)
public class Exception01 {
public static void main(String[] args) {
// 문자(char) > 홀따옴표
// 문자열 (String) > 쌍따옴표
// System.out.println('abc'); - Error(체크 예외)
System.out.println("ABC");
// try-catch 블록
// === 기본 형태 ===
// try {
// // 예외가 발생할 수 있는 코드
// } catch (ExceptionType e) {
// // 예외 발생 시 실행할 코드
// } catch (ExceptionType e) {
// // 예외 발생 시 실행할 코드
// }
// catch 블록: 특정 예외 타입이 발생했을 때 실행될 코드를 정의
// >> 다중 catch 블록으로 사용 가능 (여러 예외 처리 가능)
try {
// 런타임(언체크) 예외
int division = 10 / 0;
// >> 수를 0으로 나눌 수 X
} catch (Exception e) {
// try 블록 내에서 발생하는 예외를 ()소괄호 내에서 매개변수로 전달받아
// {} 실행문에서 처리
// >> 매개변수의 형식: 타입 변수명
System.out.println("0으로 나눌수 없습니다");
}
System.out.println("정상적인 실행입니다.");
System.out.println("===========================");
try {
int division = 10 / 0;
int[] numbers = new int[5];
numbers[10] = 50;
// ArithmeticException 발생
String text = null;
System.out.println(text.length());
// : null을 계산할 경우 예외 발생
// : NullPointerException 발생
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("배열 인덱스 초과 오류 발생" + e.getMessage());
} catch(NullPointerException e) {
System.out.println("null을 계산할 경우 오류 발생" + e.getMessage());
} catch(Exception e) {
System.out.println("초과 오류 발생" + e.getMessage());
} finally {
System.out.println("finally 블록 실행");
// >> 예외 발생 여부와 상관없이 항상 실행되는 코드 블록
}
}
}
(throw 블록)
public class Exception01 {
public static void main(String[] args) {
// == throw 블록 ==
// : 예외를 직접 발생시키는데 사용
// >> 특정 조건에서 예외를 발생 시킬 경우 사용
// >> 주로 조건문과 함께 사용
int age = -10;
try {
if (age < 0) {
// throw new 예외타입("예외 메시지 작성");
// >> 예외 메시지는 예외 객체의 .getMessae()를 통해 출력
throw new Exception("나이는 음수가 될 수 없습니다");
}
} catch (Exception e) {
System.out.println(e.getMessage());
// 나이는 음수가 될 수 없습니다.
}
System.out.println("반드시 실행되어야 할 코드");
}
}
(사용자 정의 예외 클래스)
import java.util.InputMismatchException;
class CustomException extends Exception {
CustomException(String msg) {
super(msg);
}
}
public class Exception02 {
public static void main(String[] args) {
// == 사용자 정의 예외 사용 ==
try {
throw new CustomException("사용자 정의 예외 발생");
} catch (CustomException e) {
System.out.println(e.getMessage());
}
System.out.println("-------------------------");
Scanner sc = new Scanner(System.in);
try {
System.out.println("정수를 입력하세요");
int number = sc.nextInt();
System.out.println("입력하신 숫자는 " + number + "입니다");
} catch (InputMismatchException e) {
System.out.println("정수가 아닌 다른 타입의 입력이 작성됨");
// e.getMessage()
// : 위의 결과값이 null인 경우 해당 예외에 대한 메시지가 담겨있지 X
} finally {
sc.close();
}
}
}