언어/Java

JAVA 예외처리

DH_PARK 2024. 10. 1. 01:50

우선 예외처리 로깅을 하기 전에 "오류" 라는 단어에 대한 정의

오류 : 개발자가 의도하지 않은 결과 , 참에서의 거리

오류 종류 :
- 컴파일 에러 : 문법을 잘못 작성하거나 해서 컴파일을 하기 전에 일어나는 에러. 아예 실행이 되지 않는다 !

    그래서 나타나는 오류문으로 오류부분을 파악할 수 있어서 비교적 수정이 쉽다. !

- 런타임 에러 : 개발자가 코드를 잘못짜서 실행 도중에 일어나는 에러 (치명적인 에러임!!)

    에러 발생시 개발자가 직접 오류가 어디서 났는지 찾아야 한다.

    또는 의도치 않은 예외상황으로 일어나는 에러가 있을 수도 있음.

 

암튼 오류는 무조건 일어나면 안되는 안좋은 문제라는거다 !

 

예외 처리 : 프로그램을 실행할 때 일어나는 오류를 대비해 미리 코드를 작성하는것 

예외는 오류와 조금 다른 뜻을 가진다. 

예외란 ? : 프로그램 실행중에 발생하는 문제는 비슷하다만 , 개발자가 해결할 수 있는 문제이다 !

예외처리를 하면 프로그램을 실행하다가 작동이 중지되버리는 상황을 방지할 수 있다. (계속 실행이 됨)

 

예외의 가장 상위 클래스 Exception . (이걸 사용하면 모든 예외에 다 적용을 시킬 수 있음)

하지만 막 사용하면 어느곳에서 오류가 있는지 모르기 때문에 아무데나 사용하기 보다는 하위에 있는 예외클래스들을 제대로 적어주는게 좋다.

 

예외처리 하는법

기본적으로 try - catch 문이 있다.

try  { 예외가 일어날 것 같은 부분의 코드

                   }

catch(예외의 타입 . 예외 일어났을 때 나오는 구문) {

          예외가 일어났을 때 실행할 코드 !          }

finally {

          예외 발생 여부와 상관없이 항상 실행    }

 

finally 는 꼭 작성해야 하는 부분은 아니다. 

 

 

throws : 예외가 발생한 부분에서 실행을 중지시키지 않고 상위 메서드로 예외를 넘긴다.

그러니까 예외가 일어난곳은 특정 메소드지만 호출한 곳은 main메서드라거나 그런 쪽이니까 그쪽으로 예외상황을 넘긴다는 뜻이다. 

왜 넘기냐 ? 예외를 넘기지 않으면 일일히 그 메서드의 특정 로직을 계속 수정해야 할 수도 있는 피곤한 상황이 생길 수 있기 때문이다.

그치만 상위 호출자에게 예외를 넘기면 그 쪽에서만 코드를 수정하면 되기 때문에 메소드의 재사용성이 높아진다.

그리고 예외를 넘겨받은 상위 호출자에는 무조건 try catch 문이 있어야 한다.

(안해도 되긴 하는데 그러면 그냥 에러나면서 실행 종료되는거임)

일단 안전하게 프로그램을 실행시키고 종료하기 위해 사용하는 것이다.

 

근데 예외를 의도적으로 강제로 발생시키기도 한다. why ?

 

1. 개발자가 로직을 짜다가 어딘가 잘못되었을 때 그곳이 잘못되었다면 일부로 예외를 발생시켜서 그곳이 잘못되었다는 것을 쉽게 확인할 수 있게 하기 위해 !

public void setAge(int age) {
    if (age < 0 || age > 150) {
        throw new IllegalArgumentException("나이는 0에서 150 사이여야 합니다.");
    }
    this.age = age;
}
//예를 들어 나이가 0과 150 사이라면 이라는 조건문을 사용할 때 조건에 맞지 않아도 실행이 종료된다거나
하지는 않지만 일부러 그럴 상황일 시에 일부러 예외를 발생시켜서 조건에 맞지 않는 값이 들어가있다는걸
빨리 파악할 수 있게 하기 위해 사용한다.

 

2. 잘못된 부분을 처리하기 위해 

예외가 일어났다면 다른 값으로 값이 수정되는 식으로 해서 예외가 일어났던 부분을 정상적으로 만들기 위해 사용할 수도 있다.

 

3. 메서드에서 처리가 불가능한 상황을 상위 호출자로 알리기 위해

 

public String readFile(String fileName) throws IOException {
    if (fileName == null) {
        throw new IOException("파일 이름이 null 입니다.");
    }
    // 파일을 읽는 로직...
}

fileName 이 null 이라면 입출력오류(IOException) 를 일부러 발생시킨다.
그리고 이 메서드에서 throws 로 상위호출자에게 예외를 전달한다.

 

4. 사용자 정의 예외를 통해 상황을 명확하게 표현하기 위해

유효성 검사같은 느낌으로 예외가 일어날만한 상황일 때 메서드를 따로 만들어서 예외상황이라면 예외를 발생시킨다.

 

 

 

결론은 예외를 일부러 발생시키는건 예외상황이라는걸 개발자가 빨리 인지할 수 있게하고 신속히 처리할 수 있게 하기위함이다.

'언어 > Java' 카테고리의 다른 글

자바 싱글톤패턴이란?  (1) 2024.10.03
24년 09월 23일  (0) 2024.09.30
자바의 컬렉션이란?  (0) 2024.09.30
자바 Property란?  (1) 2024.09.30
Java 제네릭이란?  (0) 2024.09.30