JAVA 마스터가 되기 위한 여정-10
10. 예외 처리
10-1. 예외 클래스
예외
사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류.
발생시 바로 프로그램 종료 (~~ 에러)
예외처리 해준다면 프로그램 종료 않고 정상 실행 상태 유지 가능.
예외발생가능성 높은 코드 컴파일 시 :
예외처리유무를 확인 -> 없다? -> 컴파일 되지 않음예외 & 예외 클래스
예외 종류
일반 예외 = 컴파일러 체크 예외
프로그램 실행 시 예외가 발생할 가능성이 높기 때문에 자바 소스를 컴파일하는 과정에서 해당 예외 처리 코드가 있는지 검사함.
만일 없다면 컴파일 오류 발생.
실행 예외 = 컴파일러 넌 체크 예외
실행 시 예측할 수 없이 갑자기 발생 -> 컴파일 과정에서 예외 처리 코드 있는지 검사하지 않음.
in Java, 예외를 클래스로 관리함.
- 프로그램 실행 도중 예외 발생 -> JVM이 해당 예외 클래스로 객체 생성 ->예외 처리 코드에서 예외 객체 이용가능케 함
+) 모든 예외 클래스는 java.lang.Exception 클래스를 상속받음.
RuntimeException의 하위 클래스가 아니면 일반 예외 클래스,
RuntimeException의 하위 클래스이면 실행 예외 클래스실행 예외
자바 컴파일러가 체크하지 않음 -> 개발자가 작성해야함.
NullPointerException
객체 참조가 없는 상태
= (null값을 갖는 참조 변수로 객체 접근 연산자(.)를 사용했을 때)
가장 빈번하게 발생함.ArrayIndexOutOfBoundsException
배열에서 인덱스 범위를 초과할 경우.
solution: 배열값을 읽기 전에 배열의 길이를 먼저 조사하자.
실행매개값이 없거나 부족할 경우 조건문을 통해 사용자에게 알리자.NumberFormatException
숫자로 변환될 수 없는 문자가 포함된 문자열을 숫자로 변환하려 할 때.
ClassCastException
타입 변환 : 상위&하위 클래스, 구현클래스&인터페이스 에서 발생 가능.
타입 변환이 불가한 관계에서 타입 변환하려 할 때.
solution: 타입 변환 전 변환가능한지 instanceof연산자로 확인하여 true라면 좌항 객체를 우항 타입으로 변환 가능.
10-2. 예외 처리
자바컴파일러 소스 파일 컴파일 -> 일반 예외가 발생가능성 있는 코드 발견 -> 컴파일 에러 발생시킴 -> 개발자 강제적으로 예외 처리 코드 작성.
(단, 실행 예외는 컴파일에러 발생시키지 않음)예외 처리 코드
try-catch-finally 블록
생성자 내부 & 메소드 내부 에서 작성됨.
예외 발생시 예외 처리가능토록 해줌.
- try 블록
예외 발생 가능 코드가 위치함.- catch 블록 : catch(예외클래스 e){ --- }
try블록의 코드 예외 발생 X : catch블록 실행 X
try블록의 코드 예외 발생 O : 실행멈춤, catch블록 실행 O (예외처리코드 실행), finally블록 코드 실행- finally 블록
생략 가능. 항상 실행할 내용이 있을 경우에만 작성.
try와 catch에서 return하더라도 finally블록은 항상 실행됨.일반 예외 발생 가능성이 있는 코드는 빨간 밑줄. 그~러~나~
실행 예외는 빨간 밑줄이 생기지 않음.예외 종류에 따른 처리 코드
다중 catch
try 블록 내부에 다양한 예외가 발생할 때 발생되는 예외별로 다른 예외처리 코드 작성하는 것.
일반 try-catch-finally 블록에서는 예외 발생시 즉시 실행 멈추고 catch블록으로 이동하기 때문에, catch블록이 여러 개라 할지라도 하나의 catch 블록만 실행함.catch 순서
다중 catch 블록 작성 시, 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 함.
왜냐하면 하위 예외는 상위 예외를 상속했기에 상위 예외 타입도 되므로 실행을 하지 않게 됨.
그러므로, 모든 예외들은 Exception을 상속받기 때문에 뭐든간에 Exception은 제일 마지막에 해야 함.예외 떠넘기기
메소드를 호출한 곳으로 throws키워드를 통해 예외를 떠넘기는 것.
throws:메소드 선언부 끝에 작성됨, 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할, 떠넘길 예외 클래스를 쉼표로 구분하여 뒤에 나열해줌.