다라다라V
article thumbnail
Published 2022. 11. 4. 00:04
[JAVA] 12. 예외처리 코딩언어/JAVA
728x90
반응형

프로그램을 실행시키면 예기치 못한 결과를 맞이하거나, NullPointException과 같은 예외로 실행하지 못할 수도 있습니다. 오늘은 자바에서 예외를 처리하는 방법을 배워보겠습니다.

자바의 예외는 0으로 나누거나, Null 값을 가지는 참조 자료형을 참조하는 등 미리 지정된 경우가 있습니다. 또한 잘못된 처리로 인한 예외를 발생시켜야하는 사용자 지정 예외도 존재할 것입니다. 두 가지 경우의 예외를 발생시키고 이를 처리하는 방법에 대해 배울 것 입니다.

📚 예외 (Exception)

  • 프로그램 실행 중에 예기치 못한 상황에서 발생하는 비정상적인 상황을 가리킴
  • 문법에 맞지 않게 작성된 코드는 컴퍼일러에 의해 컴파일 오류로 걸러지지만
    예외는 사용자의 잘못된 입력같이 예기치 못한 상황에 의해 프로그램 실행 중에 발생

예외 사례는 다음과 같습니다.

  • 연산자에 의해 발생할 수 있음 (정수를 0으로 나누는 경우, 잘못된 캐스팅)
  • 유효하지 않은 배열의 첨자를 사용한  선택식
  • 객체가 할당되지 않은 참조변수의 사용
  • 잘못된 형식의  콘솔 입력이나 파일 접근시의 문제
  • 메서드 호출에  의해 발생할 수도 있음
  • 인위적으로 발생시킬 수도 있음 (문법적으로는 문제가 없으나 논리적으로 맞지 않은 상황을 예외로 규정 가능)

📚 예외처리 (Exception Handling)

  • 기본적으로 예외가 발생하면 프로그램의 비정상적인 종료 발생
  • 예외발생 시 프로그램의 비정상적인 종료 대신 계속해서 정상적인 수행할 수 있도록 처리
  • 실행중에 예외가 발생한다면 자바 플랫폼(JVM)이 먼저 인지하여 현재 실행중인 응용프로그래메에게 예외를 전달
  • if 조건문으로 예외 발생 상황을 미리 검사하는 것은 예외 상황의 처리가 복잡하므로 사용 X

📚 예외 처리

예외 사항이 발생하면 예외 객체가 발생됩니다. 이 예외 객체를 처리하는 방법은 크게 두 가지가 있습니다.

  1. try ~ catch 문에 의해 직접 처리
  2. 메서드 호출측으로 던져짐

조수에게 프린트 해오는 것을 시켰는데 프린트가 망가져서 일을 수행하지 못한다(예외)고 가정해봅시다.

1번 방법은 문구점에 가거나, 내가 손으로 쓰는 등 각 상황별로 오류를 해결합니다. 

2번 방법은 다시 나(호출측)에게 돌아와 해결해달라고 말하는 것입니다.

 

이렇게 예외 처리를 하면 얻을 수 있는 장점은 다음과 같습니다.

  • 코드 상에서 정상상태와 예외 상태를 명료하게 구분 가능
  • 예외 발생 이후의 코드에 대해 신경쓸 필요가 없음

 

📚 예외 객체와 예외 클래스

📃 예외 객체 (Exception object)

  • 예외는 던져진다는 특징이 존재, JVM이나 프로그래머가 처리함
  • 프로그램에서  '예외'도  하나의  객체로  표현됨
  • 일반 객체처럼 클래스를 이용하여 정의되어 사용가능

📃 예외 클래스

  • 예외를 나타내는데 사용되는 클래스
  • java.lang.Throwable로부터 파생된 클래스
  • 일반 클래스와 마찬가지로 생성자, 멤버 필드, 메소드 등을 가질 수 있음
  • 일반 객체와 차이점은 던져질(throws) 수 있음

📚 예외 클래스 종류와 구조

  • Object 는 모든 객체가 상속받는 부모 클래스
  • 에러와 예외는 Throwable을 상속받음
  • Error은 시스템이나 프로그램 수행에 치명적인 경우로 우리가 처리할 수 없다
  • Exception은 예외 객체를 위한 클래스로 처리의 대상이다
  • 결국 예외란 사용자 프로그램에서 try~catch 블록을 이용하여 제어할(handling) 수 있는 실행 시간 오류
  • RuntimeException 은 피할 수 있는 예외로 내가 처리를 잘못했을 때 발생, JVM이 이미 예외 객체를 생성함
  • RuntimException을 제외한 예외들은 치명적이므로 반드시 예외 처리를 따로 하는 과정이 필요함

📚 Exception 과 Error

📃 Exception 클래스

  • 상대적으로 덜 심각한 예외 표현
  • 보통 '예외'라 부르는 예외 처리 대상

📃 Error 클래스

  • 상대적으로 더 심각한 예외를 표현
  • 보통 '에러'라 부르는 예외 처리 불가능한 대상

📚 Exception 클래스

📃 Unchecked Exception

  • 필요에 따라 예외 처리 가능
  • 예외 처리를 하지 않아도 컴파일 가능
  • RuntimeException 이하의 클래스들

📃 Checked Exception

  • 반드시 예외 처리가 필요함
  • 예외 처리를 해주어야지만 컴파일 가능
  • 나머지 클래스

📚 RuntimeException 클래스의 sub class들

(1) ArithmeticException

  • 0으로 나누는 경우에 주로 발생

(2) ArrayIndexOutOfBoundsException

  • 잘못된 배열의 첨자를 사용한 경우 발생

(3) NegativeArraySizeException

  • 배열 선언시 할당 크기가 음수인 경우 발생

(4) ClassCastException

  • 변환 불가능한 형 변환 수행시 발생

(5) NullPointerException

  • null 값을 갖는 참조 변수를 접근하는 경우 발생

(6) NumberFormatException

  • 래퍼 클래스의 parseXXX() 메서드로 문자열이 나타내는 숫자로 변환시
  • 일치하지 않는 자료형의 숫자로 변환시 발생

(7) java.util.InputMismatchException

  • util 패키지에 있으므로 반드시 import 해야함
  • Scanner 클래스의 nextXXX() 메서드로 입력시
  • 입력 받고자 하는 자료형과 입력된 값의 자료형이 다른 경우 발생

(8) java.io.IOException

  • 입출력 동작의 실패
  • Checked 클래스이므로 반드시 확인해서 처리해야함

📚 예외 메시지 표시 방법

  • Throwable 클래스의 멤버 메서드
  • 예외 클래스는 던져질 수 있으므로 Throwable을 상속받아야함

 

📃 void printStackTrace( )

  • 예외 발생 원인과 경로를 추적하여 콘솔(표준에러)에 표시
  • 보통 개발단계에서 디버깅 목적으로 주로 사용

 

📃 String getMessage( )

  • 예외 객체가 가지고 있는 에러 메시지를 반환
  • 개발 이후에는 콘솔창을 보지 않으므로 이 방법을 추천함
  • 문자열로 오류 메시지를 받아서 대화상자로 띄우는 방식
catch(ArithmeticException ae) {
    String str = ae.getMessage();
    System.err.println(str);
}

📚 예외 처리 방법

📃 방법 1 : 예외 발생시 try ~ catch 문으로 특정 처리 수행 후 프로그램 계속 진행

  • try ~ catch 문으로 처리 하지 않은 예외는 JVM이 에러 메시지를 출력하고 프로그램을 강제 종료
  • 비정상 적인  프로그램  종료
  • 궁극적으로는 예외는 처리할 필요가 있으므로 try ~ catch 문으로 처리

 

📃 방법 2 : 예외가 발생하면 throws 문으로 현재 메서드를 호출한 측으로 예외 객체를 전달

  • main 메서드에서도 처리되지 않은 예외는 프로그램의 비정상적인 종료를 야기함
  • 예외 객체를 메서드 호출측으로 넘기고 호출츠게엇 처리하도록 함
  • 호출측에서는 처리되도록 코드를 작성함

📚 try ~ catch 문

📃 try 문

  • 예외 가능성이 있는 정상 문장들과 그 종속적인 문장들을 작성
  • 하나의 try 문에 여러 문장이 존재할  경우 예외를 발생시킨 문장 다음의 try 블럭 내의 문장들은 처리되지 않음
  • 보통 하나의 try 문에는 연관된 문장들을 넣고 그 문장들 중에서 발생되는 예외를 다수의 catch문으로 나누어 검사

 

📃 catch 절 

  • 예외 발생시 대응되는 catch 문으로 제어가 넘어감
  • 선언된 예외 클래스 및 그 하위 클래스 타입의 예외도 잡아냄
  • 같은 try 문에 여러 catch 절이 포함된 경우
  • 각 catch 절은 위에서부터 순서대로  처리
  • 상대적으로 상위 예외 클래스형의 객체를 더 나중에 검사토록 해야 함
  • 실행될 가능성이 전혀 없는 catch 절은 compile error를 야기 시킴

 

📃 finally 절

  • try 블록에 진입 후 예외 발생과 무관하게 무조건 수행되  영역
  • try절 혹은 catch절 중간에 return 되더라도 수행됨
  • 어느 상황에서건 꼭 실행되어야 하는 문장 포함
  • 생략 가능

 

📚 예외를 고려한 제어의 흐름


📚 throws

  • 메서드 구현부에 기술
  • 메서드 이름과 { 사이에 전달할 예외 크래스명과 함께 나타냄
  • 예외 발생시 예외 처리를 현재 메서드를 호출한 곳으로 양도
  • 메서드 호출의 역순으로 예외가 처리될 때까지 전달됨
  • 언젠가는 try ~ catch 문으로 처리해주어야하므로 main 메서드에서라도 처리해야함
  • main에서도 처리되지 않으면 비정상적인 프로그램 종료 

📚 예외 강제 발생

  • JVM이 지정한 오류 외에 사용자가 상황별로 지정한 예외가 있을 것
  • throw 문으로 지정한 예외 객체에 대해 예외 처리 매커니즘을 강제로 실행
  • 키워드 throws와는 다름

 

throw <예외객체>;
throw new <예외클래스생성자>;
  • 예외 객체를 지정시 예외를 던짐
  • 메서드의 반환값과 관계없이 호출측으로 돌아올 수 있음

📚 사용자 정의 예외

  • 프로그래머가 직접 필요한 예외 클래스를 만들어 사용
  • 보통 프로그램에서 정의하는 논리적인 예외상황 처리 위해 사용됨

 

📃 사용자 정의 예외의 선언

  • 보통 Exception 클래스부터 상속 받아 정의
  • 혹은 Exception의 서브 클래스로부터도 상속 가능
  • 관례적으로 XXXException 이란 이름을 사용
  • 보통 다른 멤버는 추가하지 않아도 되나 보통 예외 정보 설정 위해 생성자는 구현

 

반응형

'코딩언어 > JAVA' 카테고리의 다른 글

[JAVA] 14-1 Swing의 기본 특징  (0) 2022.11.08
[JAVA] 13. 제네릭과 컬렉션  (0) 2022.11.05
[JAVA] 11 추상 클래스와 인터페이스  (0) 2022.11.03
[JAVA] 10. 상속과 다형성  (0) 2022.10.30
[JAVA] 09. 클래스 상속  (0) 2022.10.24
profile

다라다라V

@DaraDaraV

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