코드스테이츠_국비교육/[Section1]

16.06_예외 처리_22.09.13

생각없이 해도 생각보다 좋다. 2022. 9. 15. 00:01

학습 키워드

  • 예외 처리
  • 컴파일 에러와 런타임 에러
  • 자바 예외 클래스의 상속 계층도
  • try-catch 문과 예외 전가
  • throws 키워드와 throw 키워드

 

오류

>오류의 요인

  • 외부적인 요인

: 하드웨어 문제

: 네트워크 연결 끊김 등

  • 내부적인 요인

: 개발자의 코드 작성 에러

: 컴파일 에러, 런타임 에러 등이 존재

>컴파일 에러, Compile Time Error

: 컴파일 할 때 발생하는 에러

: syntax error 라고도 함. 주된 원인이 문법적인 문제이기 때문.

: 세미콜론 생략, 오탈자, 잘못된 자료형 등 문법적인 문제로 인해 발생하며, 자바 컴파일러가 에러를 발견함.

: IDE가 코드를 작성하는 순간에 친절히 알려줌

>런타임 에러, Run Time Error

: 프로그램이 실행될 때 발생하는 에러

: 개발자가 작성한 코드가 컴퓨터가 수행할 수 없는 작업일 때 발생함.

: 자바 가상 머신에 의해 감지되는 에러.

>에러와 예외

  • error, 에러

: 복구하기 어려운 수준의 심각한 오류

: 메모리부족(OutOfMemoryError), 스택오버플로우(StackOverflowError) 등

  • exception, 예외

: 상대적으로 미약한 오류

: 잘못된 사용 혹은 코드를 수정함으로써 해결 가능


예외 클래스

>자바의 예외처리 과정

  1. 예외 발생
  2. 예외 클래스의 객체 생성
  3. 예외처리

>예외 클래스의 상속 계층도

  • Throwable

: Errors 클래스와 Exceptions 클래스의 상위 클래스

  • Exceptions

: 모든 예외처리 클래스의 상위 클래스

: 실행 예외 클래스와 일반 예외 클래스를 하위 클래스로 포함함.

>일반 예외 클래스 (Exception)

: 실행 예외 클래스(혹은 실행 예외 클래스의 하위 클래스)를 제외한 모든 Exception 클래스 및 그 하위 클래스를 의미

: checked exception이라고도 함.

: 컴파일러가 코드 실행 전 예외 처리 코드 여부를 검사하기 때문

: 사용자편의 실수가 주된 원인.

//예시: 잘못된 클래스명(ClassNotFoundException), 데이터 형식(DataFormatException)

>실행 예외 클래스 (Runtime Exception)

: 런타임(실행) 시 발생하는 예외 클래스 및 그 하위클래스를 의미함.

: unchecked exceptioin이라고도 함.

: 개발자의 실수, 자바 문법 요소 등이 주된 원인.

//예시: 클래스 간 형변환 오류(ClassCastException), 벗어난 배열 범위 지정(ArrayIndexOutOfBoundsException), 값이 null

인 참조변수 사용(NullPointerException) 등


예외 처리

>예외 처리 목적

: 기본적으로 예외 및 에러가 발생하면 프로그램이 코드를 실행 중간에 정지됨.

: 예외 처리는 에러가 발생해도 프로그램이 중단되지 않게 하기 위해 사용된다.

>try{...} catch(~~){...}

: 예외 처리 구문의 형식.

try{...}

: 예외가 발생할 수 있는 코드를 바디에 삽입함.

: 예외 발생 시 catch의 바디 내용이 실행됨.

catch(~~){...}

: 발생 가능한 예외를 (~~)안에 작성함.

: (~~)은 매개변수와 비슷한 의미로, Exception 참조형의 참조 변수를 작성하면 모든 예외를 처리할 수 있다.

: try문에서 해당 예외가 발생하면 catch문의 코드가 실행됨.

: 예외 발생 시 실행될 코드를 catch의 바디에 작성

: 하나의 try문에 여러 catch문을 작성할 수 있음. 발생하는 예외에 따라 해당하는 catch문이 실행됨.

: 여러 개의 catch문을 사용할 땐 좁은 범위의 예외에서 넓은 범위의 예외로 작성하는 것이 좋음(조건문처럼)

finally

: catch문 뒤에 작성될 수 있는 구문

: default 값으로, 예외 발생 여부와 상관없이 항상 실행되는 부분

: 선택적 옵션이기에 생략 가능함.

try{
...(a)
}
catch(...(b)){
...(c)
}
finally{
...(d)
}

try-catch문 흐름
1. (a)에 에러가 없으면, (a)를 실행시킨다.
2. (a)에 에러가 있으면, (b)의 예외 타입을 확인한다.
//ex_(b): Exception e
3. (b)의 타입과 일치하는 에러라면 (a)대신 (c)를 실행한다.
4. 모든 과정과 상관없이 마지막에는 (d)를 실행한다.

 

예외 처리 전가(throws)

>의미

: 예외를 호출한 곳으로 다시 예외를 떠넘기는 방법

: 예외가 호출한 곳에서 예외를 해결하는 방법

: 다른 곳에서 끌어온 것에 예외가 발생했을 때 처리하는 방법

>목적

: 예외가 생길 때마다 예외가 생긴 곳을 찾아 try-catch문을 작성하는 것이 아닌, 예외가 생기는 곳에서 바로 처리할 수 있

게 하기 위함.

>main throws

: main메서드 에서도 throws 키워드를 사용할 수 있음.

: 이 경우 JVM이 실행하다 생긴 예외를 main에서 원인을 찾으려했으나, 다시 예외 처리를 전가했기 때문에 JVM이 최종적

으로 예외를 처리함. (예외의 내용을 콘솔에 출력함)

>throw 키워드

: 예외를 의도적으로 발생시킬때 사용.