오류란?
프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우 이런 결과를 초래하는 원인
[에러의 종류]
- 컴파일 에러: 컴파일 시에 발생하는 에러
- 런타임 에러: 실행 시에 발생하는 에러
- 논리적 에러: 실행은 되지만, 의도와 다르게 동작하는 것
[컴파일 과정]
1. 소스코드를 컴파일 하면 컴파일러가 소스코드(.java)에 대해 오타 또는 자료형 체크 등의 기본적인 검사를 수행
2. 컴파일로 발생한 에러를 모두 수정하면 클래스 파일(.class)이 생성되고 생성된 클래스 실행
[런타임 에러?]
에러(error): 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
[OutOfMemoryError, StackOverflowError]
예외(exception): 프로그램 코드에 의해서 수습될 수 있는 미약한 오류
• 예외클래스는 위와 같이 두가지로 분류할 수 있다.
1. RuntimeException Class
2. Exception Class
[1] RuntimeException Class : 프로그래머의 실수에 의해서 발생하는 예외
- ArrayIndexOutOfBoundException: 배열 범위 초과
- NullPointerException: null인 참조변수의 멤버를 호출
- ClassCastException: 클래스간 형변환 오류
[2] Exception Class: 외부의 영향으로 발생하는 에러로, 프로그램 사용자에 의해 발생
- FileNotFountException: 존재하지 않는 파일 접근
- ClassNotFoundException: 클래스명 입력 오류
- DataFormatException: 입력 데이터 형식 오류
• 예외처리
프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것
예외의 발생으로 인한 비정상 종료를 막아 정상적인 실행상태를 유지하는 것을 목표
▶︎ try 블럭 내에서 예외가 발생한 경우
1. 발생한 예외가 있는 블럭이 있는지 확인
2. 일치하는 블럭이 있으면 해당 문장을 수행하고, 전체 try-catch문을 빠져나간다.
3. 만약 일치하는 블럭이 없을 경우 예외처리 못한다.
▶︎ try 블럭 내에서 예외가 발생하지 않은 경우
: catch 블럭을 거치지 않고 전체 try-catch문을 빠져나간다.
• (0/0이 해당하는 예외처리가 있기때문에 3 다음 예외처리 catch문으로 들어간다.)
[실행결과]
1
2
3
5
6
•예외발생 원인을 확인하는 방법
printStackTrace(): 예외발생 당시의 호출스택에 있던 메서드의 정보와 예외메시지를 출력
getMessage(): 발생한 예외클래스의 인스턴스에 저장된 메시지
• 멀티 catch 블럭
‘|’ 기호를 사용해 중복 코드를 줄여 여러 예외처리를 할 수 있다.
[중요한 점]
조상 | 자손 ✘ : 컴파일 에러 (조상만 써도 되기때문에)
공통 분모인 조상 예외클래스에 선언된 멤버만 사용 가능
void method() throws Exception1, Exception2, Exception3 {
}
만약 최고조상인 Exception클래스를 메서드에 선언하면 모든 종류의 예외가 발생 가능성이 있음
자바에서는 메서드를 작성할 때 메서드 내에서 발생할 가능성이 있는 예외를 메서드의 선언부에 명시하여 이 메서드를 사용하는 쪽에서는 이에 대한 처리를 하도록 강요하기 때문에, 견고한 프로그램 코드를 작성할 수 있다.
예외의 발생여부에 상관없이 반드시 실행해야 할 코드
try - catch - finally (만약 예외가 발생하지 않을 경우 try → finally)
[실행 결과]
호출되었습니다.
finally
main으로 돌아왔습니다.이를 통해 try를 수행 후 return을 하더라도 바로 main으로 가는 것이 아니라 finally를 거친다는 것을 알 수 있다.
try-with-resource는 입출력 클래스를 사용할 때 주로 사용되며, 클래스 사용 후 꼭 닫아줘야 하는 경우에 많이 사용된다.
• close()를 사용해 닫을 수 있는데 이 close()에서 예외가 발생할 경우를 생각해야 한다.
try-with-resource문의 괄호에 객체를 생성하는 문장을 넣으면, 이 객체는 따로 close를 호출하지 않아도 try를 벗어나는 순간 자동으로 close 호출
이를 사용하면 두 개 이상의 예외가 발생할 경우 원래는 마지막 에러에 대한 정보만 출력되었다면, suppressed라는 억제된 에러라고 해서 모든 예외에 대한 정보를 확인할 수 있다.
하나의 예외에 대해서 예외가 발생한 메서드와 호출한 메서드 모두에서 처리하도록 하는 것(예외를 처리한 후 다시 발생시키는 방법)
Throwable initCause(Throwable cause) 지정한 예외를 원인 예외로 등록
Throwable getCause( ) 원인 예외를 반환