JAVA < 예외 처리 >

Zero·2022년 4월 2일
0

예외 처리

예외처리는 자바 프로그램에서 실행중 발생할 수 있는 예외적인 상황을 대비한 코드를 미리 만들어두는 것으로 문제 발생시 좀 더 안전한 구조를 제공하며 문제 해결에 필요한 정보등을 제공


에러

일반적으로 프로그램에서 문제가 발생하는 것을 에러(error)라고 하며 보통 에러는 컴파일 과정에 발생하는 컴파일 에러와 실행중 발생하는 런타임 에러로 구분

  • 근래 개발도구의 지원으로 컴파일 에러는 소스코드 작성과정에서 대부분 발견
  • 런타임에러는 프로그램 로직상의 문제나 실행중 부적절한 데이터 혹은 객체 참조등으로 발생

try ~ catch 블럭

기본적인 예외처리 방법

  • 특정 파일을 로딩하려고 할 때 파일이 해당 경로에 없는 경우
  • 네트워크로 서버에 접속하는 경우 서버가 다운되었거나 네트워크 연결에 문제가 있는 경우
  • 문자열 데이터를 읽어 객체의 참조를 구하는 경우
  • 정수를 0으로 나누는 경우

이러한 예외 상황 환경에서 동작하는 클래스를 만들 때 해당 기능을 수행하는 메서드에 throws구문을 추가해 특정 예외 상황 처리를 강제하게 된다

예외 처리 클래스는 java.lang.Exception 클래스를 부모로 하는 대표적인 클래스들이 있으며 사용자 정의 예외클래스를 만드려면 Exception 클래스를 상속받아 구현하면 된다


예외처리 유형

  • checked Exception

    Exception 클래스를 상속받아 구현된 클래스 ( RuntimeException 클래스 제외 )
    컴파일러에 의해 강제로 예외처리가 요구됨


  • Unchecked Exception

    RuntimeException 클래스를 상속받아 구현된 클래스
    강제로 예외처리가 요구되지는 않지만 필요에 따라 예외처리가 가능



  • test.txt 파일은 반드시 이클립스 폴더 최상위에 생성해야 함
  • File 클래스를 이용해 특정 파일을 읽을 수 있도록 스트림 생성
  • File 객체를 Scanner 클래스의 생성자 인자로 전달
  • 파일로 부터 데이터가 있을 때까지 읽어 출력

💡 문제점 💡

-> 분명 프로그램 코드에는 이상이 없지만 파일이 제 위치에 없기 때문에 예외상황이 발생해 다음과 같은 예외 메세지를 볼 수 있다


중복 catch 블럭 사용하기

1) 비효율적인 예시


2) 효율적인 예시


두 개의 예외에 대해 동일한 처리를 하는 경우

-> 이 경우 만일 두 예외가 부모 자식 관계라면 부모 클래스만 명시


여러 예외 처리가 동일한 경우

-> 그냥 최상위 클래스인 Exception 만 처리하면 됨


예외처리 흐름과 처리 내용

예외처리는 try 블럭안에 있는 코드들이 차례로 실행되며 예외가 발생한 구문 이후의 코드들은 실행되지 않고 catch 블럭에서 해당 예외처리를 따르게 된다 위 예제에서 `method1()에서 예외가 발생한다면 method2()는 실행되지 않는다.

  • 보통 예외 처리 블럭에서는 예외상황 추적을 위해 e.printStackTrace() 메서드를 사용


fianlly

finally는 예외가 발생한 경우나 혹은 발생하지 않은 경우 모두 수행되는 블럭을 지정할 때 사용 코드의 성공/실패 여부에 상관없이 반드시 실행되어야 하는 구문이 있다면 finally에 넣어준다

예외 던지기와 예외 클래스 작성

메서드를 만들 때 throws 구문을 넣어주면 현재 메서드에서 특정 예외 처리를 하지 않겠다는 의미가 된다. 이 말은 곧 해당 메서드를 호출하는 쪽에서 해당 예외 클래스에 대한 처리 , 즉 try~catch 블럭을 사용해야 한다는 것을 의미

  • printData() 메서드 안에서 IOException을 발생시키는 메서드를 사용할 경우 자체 처리를 하지 않고 호출하는 쪽으로 예외처리를 넘김

  • 제공되는 예외클래스 이외에 내가 만든 예외클래스 역시 throws 할 수 있음

직접 예외 클래스를 만드는 경우는 Exception 혹은 RuntimeException 클래스를 상속받아 구현하면 된다. 해당 예외는 예를 들면 앞의 printData() 메서드 내에서 특정상황에 throw MyException코드를 작성함으로써 예외 코드를 동작시킬 수 있다.

  • Exception 클래스의 여러 메서드들 , ex) printStackTrace() 등의 메서드를 오버라이딩 할 수 있음
  • getMessage() 메서드만 오버라이딩한 상황
  • 생성자에서 메세지를 받아 문자열 조합후 getMessage()에서 리턴하도록 구현

  • doException() 메서드에서 MyException 예외 클래스를 throws 처리 즉, 호출하는 쪽에서 예외처리 필요
  • num 변수 값에 따라 OK를 출력하거나 예외를 발생
  • main()에서 인스턴스 생성후 doException() 메서드를 호출하고 try~catch 처리

0개의 댓글