코드를 작성하고 실행하다보면 수많은 에러가 발생한다. 나는 여지껏 '에러' 라고 뭉뚱그려 이야기했으나, 이들을 구분한다고 한다. 에러의 종류와 어떻게 처리해야 하는지에 대해 작성하려고 한다.
✅ 에러의 종류
에러에는 다음과 같은 종류가 있다.
- 컴파일 에러
- 소스코드 상의 문법에러로 소스코드를 수정해서 해결한다
- 런타임 에러
- 프로그램 실행중에 발생하는 에러로 사용자로부터 잘못된 값을 입력받거나 계산식의 오류 등으로 발생한다
- 시스템 에러
- 하드웨어의 오작동으로 발생하는 에러라서 코드를 수정해 해결이 불가능하다.
이들 중 컴파일에러와 런타임에러는 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 발생하는 프로그램 오류이므로 이를 예외(Exception)이라고 부른다.
예외에는 일반예외 (Checked Exception) 과 실행예외 (Unchecked Exception)이 있다.
Checked Exception
RuntimeException을 제외하고 Exception을 상속하고 있는 예외들이 Checked Exception에 포함된다. 예시로는 ClassNotFoundException, InterruptedException, IOException 등이 있다.
이 예외들은 반드시 예외처리를 해주어야 하며, 컴파일단계에서 예외처리가 되어있는지 확인한다. 예외처리가 되어있지 않으면 에러가 발생한다.
외부 매개체와 입출력이 일어날 때 주로 발생해 조건문이나 소스코드 수정으로 해결되지 않는다.
예를 들어 readLine() 메소드를 사용할 때 IOException을 이용해 예외처리를 하지 않으면 에러가 발생한다.
Unchecked Exception
RuntimeException의 하위 클래스들을 의미한다. 예를 들면 배열 범위를 버성난 ArrayIndexOutOfBoundsException, 객체 값이 null인 상태로 해당 객체를 참조할 때 생기는 NullPointerException 등이 있다.
이 예외들은 checked Exception과 달리 명시적인 처리를 강제하지 않고, 실행단계에서 에러 발생 여부를 확인한다.
✅ 예외처리 방법
1. Try-catch-finally 문
try블록에는 예외가 발생할 가능성이 있는 코드를 넣는다. try블록에서 예외가 발생하면 catch 블록으로 가서 블록에 명시해둔 대로 예외처리 코드를 실행한다.
finally블록은 생략이 가능하고, 예외 발생 여부와 상관없이 실행할 내용을 이 블록에 넣는다.
2. throws
throws 키워드를 사용하면 메소드를 호출한 곳으로 예외를 떠넘길 수 있다.
예외와 오버라이딩
부모 클래스의 메소드를 자식 클래스에서 오버라이딩 할 때, 자식 메소드의 예외처리는 부모의 메소드가 throws 하는 exception과 같거나 하위클래스여야 한다.
'언어 > 자바' 카테고리의 다른 글
[JAVA] 자바의 직렬화, 역직렬화 (Serializable 인터페이스) (0) | 2024.06.19 |
---|---|
[JAVA] 추상 클래스와 추상 메소드, 인터페이스와의 차이까지 (0) | 2024.06.14 |
[JAVA] 클래스 상속 (1) | 2024.06.13 |
[JAVA] 접근제한자, static과 final (0) | 2024.06.12 |
[JAVA] 객체와 클래스 (0) | 2024.06.11 |