2024.02.02

김무영·2024년 2월 2일
post-thumbnail

Exception Handling ( 예외 처리 )

  • 가벼운 error ( exception )
    ( 프로그램이 동작중에 exception이 발생하면, exception 처리 후 다음 코드로 진행 할 수 있다. )
  • 심각한 error ( Error )
    ( 프로그램이 동작할 때 문제가 발생하면 프로그램은 더 이상 실행 될 수 없음. )
  • 개발자는 프로그램이 동작할 때 가벼운 에러를 예측하고, 그에 대한 대비코드를 만들어야 한다.
  • compile Exception과 runtime Exception 두 가지로 구분되어 제공.
    • compile Exception
      • Bytecode가 제대로 생성되지 못할 상황에서 발생하는 예외.
      • IDE에서 알려줌.
    • runtime Exception :
      • 생성된 bytecode를 사용하여 저장하고 연산하는 도중에 발생되는 예외.
      • IDE에서 안알려줌.

  • Compile time
    1. 소스코드 작성
    2. 저장
    3. 컴파일
      • 실패 : 컴파일 예외
      • 성공 : bytecode(*.class) 생성
  • Run time
    • Bytecode 실행 : CPU, Memory사용
      • 문제 : 런타임 예외

예외처리 클래스의 계층도

  • Error : 프로그램을 다시 코딩하거나, JVM을 재설치 해야하는 경우도 있다.
  • Exception :
    • RuntimeException
      • 개발자가 예외처리코드를 정의하지 않아도 코드 작성시 에러가 발생하지 않는 Exception.
      • JVM이 예외를 잡아주고 예외 메세지를 출력해준다.
    • RuntimeException 이외의 Exception ( Compile Exception )
      • 개발자가 반드시 예외처리 코드를 정의해야하는 Exception.
      • 코드를 정의하지 않으면 문법 error 발생.
  • 개발자가 처리해야 할 예외의 정보는 호출하는 method 뒤에서 확인한다.
  • 예외는 try_catch, throws, throw를 사용하여 처리한다.
    • try~catch ( try ~ catch ~ finally)
      • 발생된 예외를 잡을 때 사용.

      • Compile Exception은 반드시 try ~ catch 처리해야 하고,
        Runtime Exception은 try ~ catch를 하지 않아도 에러가 발생하지 않는다.

      • 문법 )

        try{
        예외발생예상코드;
        }catch(예외처리클래스 객체명){
        예외가 발생했을 때 처리할 코드;
        }
        
        String a = "2024"
        try{
        int i = Integer.parseInt(a);
        //예외가 발생하지 않을 때 실행되어야 할 코드 정의;
        }catch(NumberFormatException nfe){
        //예외가 발생했을 때 사용자에게 제공할 코드 정의;
        }
  • Runtime Exception 처리 ( 개발자가 예외처리 코드를 누락 할 수 있다. )
    • ArithmeticException : 수에 관련된 예외 -> 0으로 나눌 때 발생
    • ArrayIndexOutOfBoundsException : 배열에 존재하지 않는 인덱스를 사용할 때
    • StringIndexOutOfBoundsException : 문자열에 존재하지 않는 인덱스를 사용할 때
    • IndexOutOfBoundsException : java.util.List에서 존재하지 않는 인덱스를 사용할 때.
    • NumberFormatException : 숫자가 아닌 문자열을 숫자로 변환할 때.
    • NullPorinterException : 객체를 생성하지않고 사용할 때.

예외메시지 출력

  • catch안에서 예외처리 객체가 제공하는 예외메시지를 출력할 수 있다.

  • Exception 객체에서 제공

  • 예외메시지는 비 정상상태의 출력이므로 System클래스의 err필드를 사용하여 출력한다.

    System.err.println(예외메시지 출력);

    1. 간단한 예외메시지 출력 ) - 모든 예외처리 클래스에서 사용할 수 있다.

      • String msg = 예외객체명.getMessage();
    2. 예외처리 클래스와 메시지 )

      • 예외객체명 => 예외객체명.toString();
    3. 자세한 예외메시지 출력 ) - 예외발생 라인수, 예외와 관련된 모든 클래스를 추적하여 출력.

      • 예외객체명.printStackTrace(); // console에 출력까지 해주는 method

multi catch

  • 예외 발생 예상 코드가 try~catch내 여러 개가 있을 때, catch를 여러 개 정의하는 것.
  • 문법 )
    try{
    예외발생 예상코드
    예외발생 예상코드
    }catch( 예외처리클래스 객체명 ){
    }catch( 예외처리클래스 객체명 ){
    }finally{
    반드시 실행되어야 할 코드;
    }
  • Runtime Exception은 개발자가 어떤 상황에서 발생하는지 인지하고 try~catch를 처리해야 한다.

throws ( 예외 던지기 )

  • method안에서 발생되 예외를 던질 때 사용.

  • throws로 던져진 예외는 호출하는 곳에서 try~catch로 처리해야 한다.

  • 예외발생 예상 코드와 예외처리 코드를 분리할 때 사용.

  • method 뒤에 정의

  • throws로 던져진 예외는 method안에서 try~catch할 필요가 없다.

  • 문법 )

    throws 예외처리클래스들...
    접근지정자 반환형 method명( 매개변수 ,,,,)throws 예외처리클래스들,,,{
      
      A코드
      
      예외발생 예상코드
      
      B코드 // 예외가 발생하면 실행되지 않는다.
    }
  • 호출 )

    try{
    method명(,,,, );
    }catch( 예외처리 클래스명 객체명 ){
    
    }

throw ( 예외 강제 발생 )

  • 특정상황에서 예외를 발생시켜 업무를 처리해야 할 때.
  • try~catch, throws와 함께 사용.
  • 사용자 정의 예외처리 클래스와 주로 함께 사용.
  • 문법 )
    throw new 예외처리클래스(); //error 발생하므로 try ~ catch로 감싸든지, throws 날려 사용(권장).

사용자 정의 예외처리클래스

  • 개발자가 구현하는 업무에 맞는 예외처리 클래스를 직접 생성하여 사용하는 것.
  • 상속으로 구현.
  • Compile Exception, RuntimeException을 만들 수 있다.

Compile Exception

  • 생성자에서 예외 발생시 출력할 메시지를 부모클래스(Exception)의 생성자로 전달한다.
    => 에러메세지로 출력된다.

  • Exception 상속

    • 생성자에 입력된 message는 getMessage와 예외처리 클래스의 객체를 출력했을 때 출력된다.

Runtime Exception

  • RuntimeException 상속

try~with~resources 문

  • JDK1.7에서 지원되는 문법
  • 개발자가 자원해제(close)를 하지 않아도 Compiler가 자동으로 try에서 자원을 해제해 주는 문법
    • 자원해제(close)를 하지않을 시 메모리 누수가 발생 : 프로그램이 동작하지 않는 원인이 된다.
  • 사용된 모든 자원이 해제되므로 static인 자원을 사용할 때에는 주의해야 한다.
    (System.in)
  • 코딩량이 줄어든다.
  • 문법 )
    try(자원 사용객체){
    //자원 사용객체 -> IOStream , SQL 연결
    자원사용객체 사용하는 코드정의 ;
    }catch(예외처리클래스 객체명){
    예외발생 처리 코드 정의.
    }
    BufferedReader br = null;
    try{
      br = new BufferedReader(
      new InputStreamReader(System.in));
      //System.in : Static을 끊지 않는다.
      String str = br.readLine();
    }catch(IOException ie){
    }finally{
      if(br!=null){
         br.close();
        }
      }
    }
    //Memory leak를 막기 위해서 스트림은 반드시 끊어야 한다.
    try(BufferedReader brr = new BufferedReader(
    new InputStreamReader(System.in))){
       String str = br.readLine();
        }catch(IOException ie){
      }
    }
    // 스트림을 끊는 코드를 작성하지 않아도 사용된 스트림을 JVM에서 자동으로 끊어준다.

IO Stream

  • java API에서 입력과 출력을 할 수 있는 클래스들.
  • 단방향 Stream( 읽기는 읽기만, 쓰기는 쓰기만 가능)
  • java.io패키지에서 관련 Stream 클래스를 제공
  • 8bit stream(byte 기반 스트림), 16bit stream(문자열 기반 스트림)으로 제공.
    • 8bit stream : 모든 종류의 데이터를 읽거나 쓸 수 있다. (파일 복사)
    • 16bit stream : 독자 포멧이 없는 문자열 데이터만 읽거나 쓸 수 있다.
      ex ) 아래한글에서 만들어진 파일은 아래한글에서만 읽을 수 있다.

컴퓨터에서 데이터 흐름도.

  • 입력스트림
    • 8bit stream : 모든 종류의 데이터를 읽거나 쓸 수 있다.
    • 16bit stream : 문자열 데이터만 읽어 들일 수 있다.
  • 입력스트림
    • 8bit stream : 모든 종류의 데이터를 출력할 수 있다.
    • 16bit stream : 문자열 데이터만 출력할 수 있다.

Stream의 상속도

  • 8bit Stream : 한번에 움직이는 데이터의 양은 작지만, 속도가 빠름
    • InputStream
      • FileInputStream
      • ObjectInputStream
      • DataInputStream
    • OutputStream
      • FileOutputStream
      • ObjectOutputStream
      • DataOutputStream
  • 16bit Stream : 한번에 움직이는 데이터의 양이 많지만, 속도가 느림
    • Reader
      • FileReader
      • BufferedReader
      • InputStreamReader
    • Writer
      • FileWriter
      • BufferedWriter
      • InputStreamWriter

0개의 댓글