Language/JAVA

(JAVA)예외 처리

doheun 2023. 1. 26. 14:14
반응형

예외 처리

예외가 발생할 것을 대비하여 코드상에서 제어하도록 하는 것


에러(Error)

  • 코드 상에서 프로그램 자체적으로 처리할 수 없는 오류
  • 시스템이 종료되어야 할 상황

예외(Exception)

  • Exception은 클래스로 볼 수 있음 (상속받은 다양한 Exception들이 있다)
  • 프로그램 자체적으로 처리할 수 있는 오류
  • 프로그램 실행 중에 발생하는 예외
    ex) 0으로 나눌 때, 배열의 범위를 벗어나는 인덱스를 사용할 때
    이러한 예외들은 미리 수정할 수 없기 때문에 프로그램 내에서 미리 예외 처리
  • java.io, java.net , java.sql의 패키지를 사용하려면 무조건 예외처리 필요

CheckedException

컴파일시에 예외 발생하고 반드시 예외 처리를 해야함(try catch or throw)

CheckedException의 하위클래스

  • FileNotFoundException : 존재하지 않은 파일의 이름을 입력
  • ClassNotFoundException : 클래스가 존재하지 않을 때

RuntimeException

프로그램 실행 중에 발생할 수 있는 예외

RuntimeException의 하위클래스

  • ArrayIndexOutOfBoundsException : 배열의 범위를 벗어남
  • NullPointerException : Null인 값을 사용할 때

try catch final 절

try{

    }catch (exception e){

    }finally{

    }

try : 실제 코드가 들어가고 예외 발생가능성이 있는 코드

catch : 예외가 발생하면 처리하는 코드

finally : 예외 발생과 상관없이 무조건 처리

try - (catch) - (finally) 순으로 수행
try와 finally는 한번만 catch는 여러번 발생가능

public static void exTest(String s) {
        int i = 0;
        String ss = "";
        try {
            System.out.println("try문");
            ss = s.substring(0, 2);
        }catch (StringIndexOutOfBoundsException se) {
            System.out.println(se + "\n문자열 길이 확인 필요");
        }catch(IndexOutOfBoundsException ie) {
            System.out.println(ie+"\n:배열의 길이를 확인하세요");
        }catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("무조건 실행");
        }
    }
//출력
try문
java.lang.StringIndexOutOfBoundsException: begin 0, end 2, length 1
문자열 길이 확인 필요
무조건 실행

위의 코드는 문자열의 범위를 벗어나도록 인덱스를 설정하고 substring 한다. 이 때 try - catch - finally 순으로 실행 된다고 했으므로 try부분에서 예외가 발생한 코드가 실행되면 바로 catch로 넘어가기 때문에 예외가 발생할 코드보다 먼저 작성해야할 코드가 있다면 미리 작성해야 한다. 또한, catch시에 작은 개념의 exception을 먼저 잡아주고 큰개념의 exception을 처리한다. 반대로 처리할 시 이클립스 내에서 오류가 발생한다.

catch(NullPointerException | NumberFormatException en) {
            System.out.println();
        }

catch문 안에 두가지 중 하나의 예외만 발생하여도 같은 처리를 하도록 할 수 있다


throws

try catch finally와 예외를 처리하는 것은 동일 하지만 예외를 상위로 미루어 처리하는 것
예를 들어, 메소드를 여러개 만들고 그 메소드들의 내부에서 여러번의 예외 처리가 필요하다면 모두 try catch finally를 사용해야 한다. 하지만 throws를 사용하여 상위로 예외처리를 따로 함으로써 시간낭비를 줄일 수 있다

public void test02() {
        InputStreamReader in = new InputStreamReader(null);
        try {
            in.read();
        }catch(IOException e) {
            e.printStackTrace();
        }catch(Exception ee) {
            ee.printStackTrace();
        }
    }

위 코드에서 예외 발생시 처리가 애매할 때 아래 코드처럼 throws를 사용한다

//thorws
public void test02() throws IOException {
        InputStreamReader in = new InputStreamReader(null);

        in.read();
}

//try catch
public void test01() {
        try {
            test02();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } 

하지만 위의 test02메서드를 다른 메서드에서 사용하려면 오류가 생긴다. 그 메서드에서 또 throws를 사용해서 다른 메서드로 넘긴다면 계속해서 오류가 발생한다. 결론적으로 throws를 사용해서 던질 수는 있지만 일시적으로 미루는 것이지 결국 마지막에 어디선가는 try catch를 반드시 처리를 해야한다.

사용자 예외 처리

//사용자 예외 처리 
//모든 예외는 Exception의 하위클래스이기 때문에 상속을 받아서 사용
public class UserException extends Exception{

    public UserException() {
        this("UserException오류");
    }

    public UserException(String msg) {
        super(msg);
    }
}

//사용자 예외 처리
public static void userExceptionTest(int a) throws UserException {
    //a는 1~10 
    if(!(a>0 && a<11)) {//0~10이 아닐떄
        throw new UserException("1~10만 가능");
    }

}
//메인
public static void main(String[] args) {

    try {
        userExceptionTest(20);
    } catch (UserException e) {
        System.out.println("사용자 예외 처리");
        e.printStackTrace();
    }
}
반응형

'Language > JAVA' 카테고리의 다른 글

(JAVA)IO  (0) 2023.01.27
(JAVA)Getter와 Setter  (0) 2023.01.22
(JAVA)인터페이스  (0) 2023.01.20
(JAVA)추상 클래스  (0) 2023.01.19
(JAVA)상속-super, this  (0) 2023.01.19