일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- RestControllerAdvice
- N:N
- 탐욕 알고리즘
- file i/o
- AOP
- 배열 탐색
- 코드스테이츠
- 스키마 디자인
- 리눅스 사용권한
- custom exception
- git 설정
- Spring 예외처리
- REST HTTP API
- Spring MVC
- 함수형 인터페이스
- Spring
- ubuntu 패스워드
- http 응답코드
- JAVA 재귀함수
- Java
- mapstruct
- 자료구조
- set-version
- ubuntu passwd
- root passwd
- char to int
- 스키마 설계
- git workflow
- ubuntu
- O(log n)
Archives
- Today
- Total
개발소설
[JAVA] 예외 처리(Exception Handling) 본문
예외 처리(Exception Handling)
- 프로그램의 비정상적인 종료를 방지, 정상적인 실행 상태를 유지하기 위해 사용
에러의 종류
- 내부적인 요인 : 개발자의 코드 에러
- 외부적인 요인 : 하드웨어 문제, 네트워크 문제, 사용자 조작 문제
내부적인 요인을 최소화 하기위해 예외처리를 해야한다.
컴파일 에러(Compile Time Error)
- 컴파일 할때 발생 하는 에러
- 세미콜론 생략, 오탈자등 문법적인 오류 , syntax 에러라고도 불림
- IDE에서 빨간줄로 미리 알려주기 때문에 발견하기 가장 좋다.
- 자바 컴파일러에서 감지
런타임 에러(Run Time Error)
- 런타임 시에 발생하는 에러
- 주로 개발자가 컴퓨터가 수행 할 수 없는 특정한 작업을 요청할 때 발생
- JVM에서 감지
에러와 예외
- 복구하기 어려운 수준의 심각한 오류를 에러
- 잘못된 사용 또는 코딩으로 인한 상대적으로 미약한 수준의 오류를 예외
- 코드 수정을 통해 수습이 가능
예외 클래스의 상속 계층도
Throwable | ||
Error | Exceptions | |
Other Exeptions | Runtime Exceptions |
- Throwable 클래스로 부터 확장
- 예외의 최고 상위 클래스는 Exception 클래스
- Exception 클래스는 일반예외 클래스와 실행 예외 클래스로 나뉜다.
일반 예외 클래스(Exception)
- 실행예외클래스(Runtime Exceptions)와 그 하위 클래스를 제외한 모든 Exception 클래스와 그 하위 클래스
- 컴파일러가 코드 실행 전에 예외 처리 코드 여부를 검사 해서 checked 예외
- 주로 잘못된 클래스명(ClassNotFoundException)이나 데이터 형식(DataFormatException) 등 사용자편의 실수로 발생
실행 예외 클래스(Runtime Exception)
- 런타임시 발생하는 RuntimeException 클래스와 그 하위클래스
- 컴파일러가 예외 처리 코드 여부를 검사 하지 않기 때문에 unchecked 예외
- 주로 개발자의 실수에 의해 발생하는 경우가 많고, 자바 문법 요소와 관련
- 클래스 간 형변환 오류(ClassCastException), 벗어난 배열 범위 지정(ArrayIndexOutOfBoundsException), 값이 null인 참조변수 사용(NullPointerException)
try - catch문
- 예외 처리를 하기 위한 문법
try{
// 예외 발생 가능성이 있는 코드 삽입
}
catch (ExceptionType1 e1){
// ExceptionType1 유형의 예외 발생시 실행 코드
}
catch (ExceptionType2 e2){
// ExceptionType2 유형의 예외 발생시 실행 코드
} finally {
// 옵션 조건
// 예외 발생 여부와 상관없이 항상 실행
}
- 정상적으로 실행되면 catch는 실행되지 않고 finally가 실행됨
- catch는 해당 유형의 예외가 발생하는 경우 실행
- catch가 여러개면 일치하는 하나의 catch만 실행
- 일치하는 예외를 못찾는 경우 예외 처리 되지 못함
예제 - 실행 순서 확인
try{
System.out.println("[소문자 알파벳을 대문자로 출력하는 프로그램]");
printMyName(null); // (1) 예외 발생 NullPointerException 발생
printMyName("abc"); // 이 코드는 실행 되지 않음
}
catch (ArithmeticException e){ // (2) instanceOf 연산자를 통해 예외클래스의 인스턴스와 비교
// 예외처리 되지 않음
System.out.println("ArithmeticException 발생");
}
catch (NullPointerException e){ // (3) 일치하기 때문에 예외처리됨 {} 안 실행
System.out.println("NullPointerException 발생");
// 예외 정보 얻는 방법 세개
System.out.println("e.getMessage: " + e.getMessage());
System.out.println("e.toString " + e.toString());
e.printStackTrace();
}
finally { // (4) 예외 발생 여부와 관계 없이 무조건 실행, option 이기 때문에 생략 가능
System.out.println("프로그램 종료");
}
static void printMyName(String str) {
String upperCaseAlphabet = str.toUpperCase();
System.out.println(upperCaseAlphabet);
}
/*
[소문자 알파벳을 대문자로 출력하는 프로그램]
NullPointerException 발생
e.getMessage: null
e.toString java.lang.NullPointerException
프로그램 종료
java.lang.NullPointerException
at Exception.printMyName(Exception.java:107)
at Exception.main(Exception.java:88)
*/
예외 전가
- try-catch문 외에 예외를 떠넘기는 방법
- throws를 통해 발생할 예외들을 호출한 곳에서 예외를 떠안게함
반환타입 메서드명(매개변수, ...) throws 예외클래스1, 예외클래스2, ... {
}
// 특정 메서드에서 모든 종류의 예외가 발생할 수 있는 경우
// Exception은 모든 예외 클래스의 상위 클래스
void ExampleMethod() throws Exception {
}
main 메서드의 예외넘기기
public class Exception {
public static void main(String[] args) {
try {
throwException(); // (1) 호출
} catch (ClassNotFoundException e) { // (3) 예외 확인
System.out.println(e.getMessage()); // (4) 예외 처리
}
}
static void throwException() throws ClassNotFoundException, NullPointerException {
Class.forName("java.lang.StringX"); // (2) ClassNotFoundException 발생
// 예외 처리를 호출하는 메소드 (main)으로 넘김
}
}
/*
java.lang.StringX
*/
의도적인 예외 발생
- throw 키워드를 통해 예외 발생 가능
try {
Exception intendedException = new Exception("의도된 예외 만들기");
throw intendedException; // 예외 만들기
} catch (Exception e) {
System.out.println("고의로 예외 발생시키기 성공!");
}
/*
고의로 예외 발생시키기 성공!
*/
'자바' 카테고리의 다른 글
[JAVA] 람다 (Lambda) (0) | 2023.03.08 |
---|---|
[JAVA] 애너테이션 (Annotation) (0) | 2023.03.08 |
[JAVA] 컬렉션 프레임 워크 (Collection Framework) (0) | 2023.03.08 |
[JAVA] 제네릭 (Generic) (0) | 2023.03.07 |
[JAVA] 열거형(enum) (0) | 2023.03.07 |
Comments