1. 예외는 우리가 바라는 상황이 아니다.
1) 예외가 주로 발생하는 원인
가. 사용자의 잘못된 입력
나. 로직, 계산을 잘못 작성
다. 하드웨어, 네트워크 오작동
라. 악의적으로 잘못된 연산을 요구, 시스템 공격
2) Error와 Exception
가. 에러 : 개발자가 어떻게 조치할 수 없는 수준
나. 예외 : 다른 방식으로 처리
2. 예외 상황 때문에 프로그램이 멈추면 안된다.
1) Checked Exception : 예외 처리를 하지 않으면 컴파일을 하지 않는다.
가. 파일 시스템 연동
나. 네트워크 연동
다. 시스템의 보안 위반 행위
2) Unchecked Exception : 실행시에 발생하는 Exception
가. 개발자들이 작성하는 로직에 의해서 처리해야 한다.
3. 가장 흔하게 보는 예외들
1) NullPointerException : 객체의 리모컨을 누르지만 실제 객체는 없을 때
가. 반드시 ‘.’으로 실행되는 부분에서만 발생
2) ArrayIndexOutOfBoundsException : 배열의 범위를 벗어나는 예외
3) NumberFormatException : 숫자로 바꿀 수 없는 데이터를 숫자로 바꿀 때
가. 사용자의 입력
나. 외부 데이터의 로딩
다. 결과 데이터의 변환 처리
4. Java에서는 예외도 객체로 처리한다.
1) 예외는 상속 구조로 처리
가. Error : 불가항력
나. Exception : 개발자가 처리
2) Exception
가. 상속 구조
- Exception e = new NullPointerException();
- Exception e = new NumberFormatException();
나. 메소드
- printStackTrace(); 예외가 발생한 위치
- getMessage(); 한 줄로 요약
- getStackTrace(); 객체화
3) 예외처리
가. 예외는 객체로 처리, 모든 예외는 Exception 클래스의 하위클래스
나. 메소드는 printStackTrace()가 가장 많이 사용
5. try ~ catch : 예외를 직접 처리
try{
예외가 발생할 가능성이 있는 코드
}catch(Exception e){
예외 발생 시 대안 처리
}
1) 예외 처리의 순서
가. 예외 처리를 하고 싶은 코드의 부분을 찾는다.
나. try 블록 안에는 정상적으로 실행될 코드를 넣는다.
다. try 블록 안에서 선언한 변수는 블록 바깥쪽에서 사용될 수 없다.
2) catch : 대안흐름
가. 항목
- 메시지
- 대안 결과
- 다른 메소드 호출, 결과 기록
나. catch의 () : 메소드의 파라미터
다. 예외 발생 시 그다음의 코드는 실행되지 않는다.
6. Exception : 상속 구조
try{
// 예외가 발생할 가능성이 있는 코드
// 모든 예외는 Exception의 하위 클래스인 객체
}catch(Exception e){ // 모든 Exception이 다 처리
// 예외 처리 시 대안 처리
}
1) catch(Exception e) : 모든 종류의 예외를 처리
2) 여러 개의 catch블록 : 원인에 따라서 다르게 처리하고 싶은 경우
7. finally : 끝끝내 실행하고 싶은 로직
1) 연결을 종료하는 작업
8. throw : 예외를 미룬다.
public void doC() throws Exception{...} : Exception 타입의 모든 예외 책임 전가
1) 예외를 받으면 반드시 처리해야 한다.
- 직접 처리 : try ~ catch
- throw
9. 예외를 잡느냐? 던지느냐?
1) 다른 메소드의 일부분으로 동작하는 경우에 예외를 던지는 것이 좋다.
2) 메소드를 호출하는 쪽 : try ~ catch
3) 호출당하는 쪽 : throws
10 사용자 정의 예외 : 예외를 만들어야 할 때
1) 사용자 정의 예외 : 고장 난 원인을 구체적으로 알려줄 필요는 없습니다.
가. 예외를 새로 만든다는 것은 상대방을 위한 배려
나. extends Exception을 이용해서 새로운 예외를 만들 수 있다.
다. 호출한 쪽에서 발생하는 모든 예외를 안다면 그것도 상당히 불편
라. 예외를 상속해서 하나 더 만들 수 있다.
댓글 없음:
댓글 쓰기