본문 바로가기

프로그래밍/Java

[Java] 10. 예외처리

프로그램 오류

프로그램 수행 시 치명적인 상황이 발생해서 비정상적으로 종료가 된 상황을 말한다.

 

오류의 종류로는 컴파일 에러, 런타임 에러, 시스템 에러가 있고

이 중 컴파일 에러는 소스 상의 문법 에러로 구문을 수정하면 해결할 수 있다.

런타임 에러는 입력 값이 틀렸거나 배열의 인덱스 범위를 벗어난 등 if문으로 처리가 가능하다.

하지만 시스템 에러는 컴퓨터 오작동으로 인한 에러이므로 구문 수정으로는 해결이 불가능하다.

 

이렇게 다양한 상황에서 소스를 수정하여 해결 가능한 에러를 예외(Exception)라 하는데

이러한 예측 가능한 에러를 처리할 때 예외처리를 사용한다.

 

예외 클래스

Exception 클래스, Error 클래스 둘 다 Object 클래스의 자손이고

모든 예외의 가장 조상은 Exception 클래스이다.

여기서 예측 가능한 에러인 Exception 클래스는 다시 반드시 예외처리를 해주어야하는

Checked Exception과 그렇지 않아도 되는 Unchecked Exception으로 나뉜다.

 

Unchecked Exception 중 하나인 RuntimeException 클래스는 우리가 가장 많이 본 Exception들의 조상 클래스이다.

프로그래머의 부주의로 인한 오류인 경우가 대다수라서 예외처리보다 코드를 수정해야하는 경우가 많다.

 

예외처리

 

Java API Document에서 클래스에 대한 생성자나 메소드를 검색하면 어떤 Exception을 발생시킬 수 있는지

확인이 가능한데 해당 메소드를 사용하려면 반드시 명시된 예외 클래스를 처리해야한다.

 

우선 메소드 선언시 throws ExceptionName문을 추가해서 호출한 상위메소드에게 처리를 위임하는 방법이 있다.

계속 위임을 하게되면 결국 메인 메소드까지 위임을 하게 되고 거기서도 처리를 안하면 비정상적으로 종료된다.

 

다른 방법으로는 Exception이 발생한 곳에서 직접 처리를 할 수 있는데 try ~ catch문을 이용한다.

try에는 Exception이 발생할 수 있는 코드를 적고 catch 구문은 try에서 Exception이 발생 시

그에 대한 처리를 적는다. 여러개의 처리를 할 수 있지만 상속 관계를 고려해서 조상 Exception이 가장 아래에 가게 적는다.

마지막으로 finally를 추가해 줄 수 있는데 이 구문에 적은 내용은 반드시 Exception이 발생하던 말던

return문을 만나더라도 실행이 된다. System.exit();를 만나면 프로그램이 무조건 종료되므로 종료시키게 하는것은 가능하다. 주로 close 처리를 할 때 사용하는데 try ~ with ~ resource문을 사용하면 finally로 close처리를 하지않아도 된다.

 

사용자 정의 예외

Exception 클래스를 상속받아서 예외 클래스를 작성하는 것인데 Exception이 발생하는 곳에서 

throw new 예외클래스명()으로 발생한다.

throw는 강제적으로 Exception을 발생시키는 구문인데 이것을 사용해서 사용자가 임의로 Exception을

발생시킬 조건과 발생했을 경우 어떻게 될지를 정해줄 수 있다.

'프로그래밍 > Java' 카테고리의 다른 글

[Java] 9. 다형성  (0) 2023.03.01
[Java] 8. API  (0) 2023.03.01
[Java] 7. 상속  (0) 2023.02.21
[Java] 6. 객체  (0) 2023.02.21
[Java] 5. 배열  (0) 2023.02.21