알쓸코지
article thumbnail
Published 2024. 11. 19. 00:32
[Java] 예외 처리 Language/Java

1. 오류 vs 예외

1.1. 오류(Error)

컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용 프로그램 실행 오류

 

오류는 주로 JVM에서 발생하기 때문에 개발자가 따로 대응할 수 있는 방법이 없다. 따라서 외부적인 조치가 필요하다.

 

1.2. 예외(Exception)

사용자의 잘못된 조작 혹은 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류

 

예외는 애플리케이션 코드에서 발생하는 오류로, 예외가 발생했을 때 프로그램이 곧바로 종료된다는 점에서는 오류와 동일하지만 적절한 예외 처리를 통해 프로그램이 정상 실행 상태를 유지하게 할 수 있다.

 

1.3. Throwable 클래스

자바에서 모든 오류와 예외의 최상위 클래스

https://madplay.github.io/post/java-checked-unchecked-exceptions

예외는 또다시 Checked Exception과 Runtime Exception으로 나뉜다.

 

2. 예외(Exception)

2.1. Checked Exception(검사 예외)

컴파일 타임에 체크되며, 반드시 처리해야 한다.
  • 에러를 적절히 처리하지 않으면 컴파일 오류가 발생한다.
  • Exception을 상속받으면서, RuntimeException을 상속받지 않는 예외 클래스들이 이에 해당된다.
  • ex. IOException, SQLException

 

2.2. Runtime Exception(실행 예외)

런타임 시점에 확인할 수 있다. 즉, 컴파일러가 체크하지 않는다. 
  • 에러 처리를 강제하지 않는다.
  • RuntimeException을 상속 받는 예외 클래스
  • ex. NullPointerException, ArrayIndexOutOfBoundsException

 

3. 예외 처리와 관련된 질문 정리

3.1. 자바에서 모든 예외는 처리해주어야 할까?

💡모든 예외를 처리할 필요는 없다. 검사 예외는 반드시 명시적으로 처리하되, 런타임 예외는 논리적 오류 등으로 프로그램이 종료되는 일이 없도록 예방하는 방식으로 처리해 주면 된다. 

 

검사 예외는 컴파일 시점에 발생할 수 있는 예외로, 적절히 처리하지 않으면 컴파일 오류가 발생하기 때문에 반드시 처리해주어야 한다. 이때 try - catch 블록으로 처리하거나, 메서드 선언부에 throws 키워드로 예외를 회피하는 방식으로 처리할 수 있다.

 

런타임 예외는 런타임 시점에 확인할 수 있는 예외로, 일반적으로 프로그램의 논리적 오류로 인해 발생한다. 예외 처리를 강제하지는 않지만, 배열의 인덱스 범위가 벗어나거나 null 값을 갖는 객체를 참조할 때 등의 이유로 프로그램이 강제로 종료되는 일을 방지하기 위해서는 필요에 따라 적절히 처리하는 것이 중요하다.

 

그렇다면 예외를 직접 처리하는 것과 전파하는 것 중 어떤 것이 좋을까?

다양한 요소를 고려하여 선택할 수 있는데,
- 예외의 중요도가 높거나, 예외 처리 로직이 복잡하고 여러 계층에서 발생할 가능성이 있다면 예외를 전파하여 한 곳에서 처리하는 것이 좋다.
- 예외 처리 로직이 간단하여 메서드 내에서 해결이 가능한 정도고, 자주 발생한다면 직접 처리하는 것이 좋다.



3.2. 예외를 처리하는 방법은?

💡 주로 try-catch 블록을 사용하여 수행한다. try 블록 안에 예외가 발생할 수 있는 코드를 작성하고, catch 블록에서 예외가 발생했을 때의 처리 로직을 구현한다.
<java />
try { // 예외가 발생할 수 있는 코드 } catch (예외타입 e) { // 예외가 발생했을 때 실행할 코드 } finally { // 항상 실행되는 코드 (선택적) }
  • try 블록: 예외가 발생할 가능성이 있는 코드를 작성한다.
  • catch 블록: 특정 예외가 발생했을 때 실행할 코드를 작성한다.
  • finally 블록: 예외 발생 여부와 관계없이 항상 실행되는 코드를 작성한다.

 

3.3. 메서드 선언부에 throws 키워드를 사용하는 경우는?

💡 throws 키워드는 메서드 선언부에서 사용되며, 해당 메서드가 특정 예외를 던질 수 있음을 명시적으로 나타내고, 호출한 쪽에서 예외를 처리하도록 하고 싶을 때 사용한다.
 
1. Checked Exception을 위임할 때

2. API 설계에서 예외를 명시할 때
3. Checked Exception이 아닌 경우, throws 키워드는 선택 사항이다.

 

throws 키워드가 있는 메서드를 호출한 코드는, 예외를 처리하거나 다시 throws를 통해 상위 메서드로 예외를 전파해야 한다.

 

<java />
public void method() throws IOException { // ... }

 

3.3.1. throw vs throws

  • throws: 메서드 선언부에서 사용하며, 예외를 위임한다.
  • throw: 특정 예외를 발생시킬 때 사용한다.

 

 

profile

알쓸코지

@chocoji

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!