10.1. 예외와 예외 클래스
오류의 종류
1) 에러
- 하드웨어의 오동작 또는 고장으로 인한 실행 중지
- 에러가 발생되면 프로그램은 종료됨
- 정상 실행 상태로 돌아갈 수 없음
2) 예외
- 사용자의 잘못된 조작 혹은 개발자의 잘못된 코딩으로 인해 발생
- 예외가 발생되면 프로그램이 종료됨
- 예외 처리를 추가하면 정상 실행 상태로 돌아갈 수 있음
예외의 종류
1) 일반 예외 - Exception
- 예외 처리 코드가 없다면 컴파일 되지 않는 예외
2) 실행 예외 - Runtime Exception
- 예외 처리 코드를 생략하더라도 컴파일이 되는 예외
- 경험에 따라 예외 처리 코드를 작성할 필요가 있을 수도 있음
10.2. 실행 예외
10.2.1. NullPointException
- 객체 참조가 없는 상태, 즉 null 값을 갖는 참조변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생함
String data = null;
System.out.println(data.toString());
10.2.2. ArrayIndexOutOfBoundsException
- 배열에서 인덱스 범위를 초과하여 사용할 경우 발생
String[] arr = {"a", "b", "c"};
arr[5] // X
10.2.3. NumberFormatException
- 숫자로 변활될 수 없는 문자가 포함되어 있을 경우 발생
String data1 = "100";
String data2 = "a100";
int val1 = Integer.parseInt(data1);
int val2 = Integer.parseInt(data2); // X
10.2.4. ClassCastException
- 타입 변환이 되지 않을 경우 발생
10.3. 예외 처리 코드 (try-catch-finally)
- 예외가 발생했을 때, 프로그램 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 코드
- try-catch-finally 구문을 이용함
try {
예외 발생 가능 코드;
} catch (예외 클래스 e) {
예외 처리
} finally {
항상 실행; // 옵션임, 예외가 발생을 해도 안 해도 실행
}
10.4. 예외 종류에 따른 처리 코드
10.4.1. 다중 catch
try {
예외 발생 가능 코드;
} catch (예외 클래스 e) {
예외 처리1
} catch (예외 클래스 e) {
예외 처리2
} finally {
항상 실행; // 옵션임, 예외가 발생을 해도 안 해도 실행
}
10.4.2. catch의 순서
!순서 주의! -- 구체적인 예외를 잡을 때
try {
예외 발생 가능 코드;
} catch (Exception e) {
예외 처리1 // 이 아래로는 catch 할 수 없음ㅡ얘를 제일 아래로
} catch (ArrayIndexOutOfBoundsException e) {
예외 처리2 // [X]
} finally {
항상 실행; // 옵션임, 예외가 발생을 해도 안 해도 실행
}
10.4.3. 멀티 catch
- 자바7부터 가능
- 하나의 catch 블록에서 여러 개의 예외 처리 가능
try {
예외 발생 가능 코드;
} catch (ArrayIndexOutOfBoundsException | NumberFormatException e) {
예외 처리1 // 이 두 예외는 똑같이 처리하고 싶다
} catch (Exception e) {
예외 처리2
} finally {
항상 실행; // 옵션임, 예외가 발생을 해도 안 해도 실행
}
10.5. 자동 리소스 닫기
try-with-resources
- 예외 발생 여부와 상관없이 사용했던 리소스 객체(각종 입출력스트림, 서버소켓, 소켓, 각종 채널)의 close() 메소드를 호출해서 안전하게 리소스를 닫아준다.
- 리소스 객체의 조건?
: java.lang.AutoCloseable 인터페이스를 구현하고 있어야 함
try(FileInputStream fis = new FileInputStrean("file.txt")) {
....
} catch(IOException e) {
....
}
10.6. 예외 떠넘기기
throws
- 메소드 선언부 끝에 작성
- 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠 넘기는 역할
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");
}
10.7. 사용자 정의 예외와 예외 발생
10.7.1. 사용자 정의 예외 클래스 선언
- 자바 표준 API에서 제공하지 않는 예외
- 애플리케이션 서비스와 관련된 예외
: 잔고 부족, 계좌 이체 실패, 회원 가입 예외 등
- 필요에 따라 예외 클래스를 만들어서 쓸 수 있어야 함
public class XXXException extends [Exception | RuntimeException]{ // 둘 중 선택
public XXXException() {} // 기본 생성자 추가
public XXXException(String message) {
super(message); // 부모 클래스의 생성자를 호출하는 것
} // 예외가 왜 발생했는지에 대한 메시지 정보
}
10.7.2. 예외 발생시키기
!주의!
throw : 예외를 발생시키는 것
throws : 예외를 떠넘기는 것
throw new XXXException();
throw new XXXException("메시지");
public void method() throws XXXException{
throw new XXXException("메시지");
}
10.8. 예외 정보 얻기
getMessage()
- 예외를 발생시킬 때 생성자 매개값으로 사용한 메시지를 리턴
- 좀더 상세 원인을 세분화하기 위해 예외 코드를 포함
: 예시-데이터베이스 예외 코드, 번호에 맞게 처리 가능
- catch() 절에서 활용함
catch(Exception e){
String message = e.getMessage();
}
printStackTrace()
- 예외 발생 코드를 추적한 내용을 모두 콘솔에 출력
- 프로그램을 테스트하면서 오류를 찾을 때 활용
- 개발할 때 주로 사용
'2022 여름방학 자바 스터디' 카테고리의 다른 글
[이것이 자바다] Ch12. 멀티 스레드 (0) | 2022.08.28 |
---|---|
[이것이 자바다] Ch11. 기본 API 클래스 (0) | 2022.08.21 |
[이것이 자바다] Ch06. 클래스 (0) | 2022.07.28 |
[이것이 자바다] Ch05. 참조 타입 (0) | 2022.07.15 |
[이것이 자바다] Ch04. 조건문과 반복문 (0) | 2022.07.14 |