본문 바로가기
JAVA/기초

[JAVA 기초] 14 예외 처리

by 푸_푸 2022. 8. 21.
728x90

*오류
- 실행 오류 : 실행 중인 프로그램이 의도하지 않은 동작을 하거나 프로그램이 중지되는 오류
- 버그 : 실행 오류 중 프로그램을 잘못 구현하려 의도한 바와 다르게 실행되어 생기는 오류

*오류와 예외
- 오류 : 프로그램에서 제어할 수 없는 시스템 오류
예) 사용 가능한 동적 메모리가 없는 경우나 스택 메모리의 오버플로가 발생한 경우
- 예외 : 프로그램에서 제어할 수 있는 오류
예) 프로그램에서 파일을 읽어 사용하려는 게 파일이 없는 경우
    네트워크로 데이터를 전송하려는데 연결이 안 된 경우, 배열 값을 출력하는데 배열 요소가 없는 경우

*오류 클래스

오류 클래스

오류 클래스는 Throwable 클래스에서 상속 받음

 

*예외 클래스의 종류

Exception 클래스

위는 하위 클래스중 사용 빈도가 높은 클래스 위주의 계층도다. 최상위 클래스는 Exception클래스다

 

*try-catch문

try{
    예외가 발생할 수 있는 코드 부분
}catch(처리할 예외 타입 e){
    try 블록 안에서 예외가 발생했을 때 예외를 처리하는 부분
}


RuntimeException : try-catch문을 사용하여 예외 처리를 하지 않아도 컴파일 오류가 나지 않음
ArithmeticException : 산술 연산 중 발생할 수 있는 예외. 0으로 숫자 나누기 같은 경우에 발생하는 예외
컴파일러에 의해 체크되지 않는 예외는 프로그래머가 알아서 처리해야 함

*컴파일러에 의해 예외가 체크되는 경우
예외 처리를 하지 않으면 컴파일 오류가 계속 남음

예외 처리를 한다고 해서 프로그램의 예외 상황 자체를 막을 수는 없음

하지만 예외상황을 알려주는 메시지를 볼 수 있고, 프로그램이 비정상 종료되지 않고 계속 수행되도록 만들 수 있음

 

*close() 메서드
프로그램에서 사용한 리소스는 프로그램이 종료되면 자동으로 해제됨
하지만 끝나지 않고 계속 수행되는 서비스 같은 경우 리소스를 여러 번 반복해서 열기만 하고 닫지 않는다면 문제가 발생함
시스템에서 허용하는 자원은 한계가 있기 때문, 따라서 사용한 시스템 리소스는 사용 후 colse() 메서드로 닫아주어야 함

*try-catch-finally문
try 블록 안에서 발생할 수 있는 예외 상황이 여러 개라면 catch 블룩을 예외 상황 수만큼 구현해야 함
이때 finally를 사용함

try{
    예외가 발생할 수 있는 부분
}catch(처리할 예외 타입 e){
    예외를 처리하는 부분
}finally{
    항상 수행되는 부분
}

 

일단 try 블록이 수행되면 finally 블록은 어떤 경우에도 수행됨 (try나 catch문에 return 문이 있어도 수행)

 

*try-with-resources문
close() 메소드를 명시적으로 호출하지 않아도 try 블록 내에서 열린 리소스가 자동으로 닫도록 함
AutoCloseable 인터페이스를 구현해야 함

try(A a = new A();){
    ....
}catch(Exception e){
    ...
}

 

위와 같이 try문의 괄호 안에 리소스를 선언함

*향상된 try-with-resources문
기존에는 AutoCloseable 인터페이스를 구현한 리소스의 변수 선언을 try문 괄호 안에서 해야 했지만,
자바 9부터 괄호 안에서 외부 선언 변수를 사용할 수 있게 됨

 

*throws
예외를 해당 메서드에서 처리하지 않고 미룬 후 메서드를 호출하여 사용하는 부분에서 예외를 처리하는 방법

세 가지 옵션중 하나를 선택하여 오류를 처리할 수 있음
1) Add throws declaration
main() 함수 선언 부분에 throws FileNotFoundException, ClassNotFoundException을 추가하고 예외 처리를 미룬다는 뜻
main() 함수에서 미룬 예외 처리는 main() 함수를 호출하는 자바 가상 머신으로 보내짐
예외를 처리하는 것이 아니라 대부분의 프로그램이 비정상 종료됨
2) Surround with try/multi-catch
catch문에서 여러 예외를 한 문장으로 처리하겠다는 뜻
3) Surround with try/catch
각 상황마다 예외를 처리하겠다는 뜻
예외 상황의 수 만큼 catch문이 생성됨. 각 예외 상황마다 다른 방식으로 처리해야 하고 로그도 다르게 남겨야 하는 경우라면 사용

*다중 예외 처리
예외는 catch문을 선언한 순서대로 검사하기 때문에
맨 위에 catch(Exception e) 문장을 쓰면 모든 예외 클래스가 Exception 상위 클래스로 자동 형 변환되어 오류가 발생함
Exception 클래스 블록은 여러 예외 처리 블록의 가장 아래에 놓여야 함

 

*사용자 정의 예외 클래스
프로그램 개발 상황에서 필요에 따라 사용자 정의 예외 클래스를 직접 만들고 발생시켜 예외 처리를 할 수 있음
예외 처리를 할 때는 로그를 남겨야 원인을 확인하고 유지 보수할 수 있음

 

728x90

댓글