본문 바로가기
개발/자바

자바 예외처리 (try~catch)

by kakk789 2022. 4. 7.

예외 처리( try~catch )

try {
    정상 명령문;
} catch(예외 클래스 e) {
    예외 시 명령문;
} catch(예외 클래스 e) {
    예외 시 명령문;
}
  • 프로그램 실행 중에 사용자의 부주의 등으로 인하여 예기치 않는 상황이 발생하는 것을 "예외"라고 하며 이것을 처리하는 것을 "예외 처리"라고 한다.
  • 자바에서 range 범위 초과나 기타 에러가 발생하였을 경우에 예외처리를 하여 오류 시 프로그램이 비정상 종료되는 것을 막을 수 있다.
  • 하나의 try 안에 여러개의 catch가 올 수 있다. 근데 각 동작마다 예외처리를 주게되면 너무 타이트하고 코드 가독성이 떨어지고 비효율적이므로,  가장 부모 클래스인 Exception하나만 이용하여 모든 예외처리를 할 수 있다. 근데 또 이렇게 되면 너무 러프해지기 때문에 특정 조건의 예외처리문만 몇개 추가하고 싶을때는 해당 예외처리 클래스만 예외처리 하고 나머지는 Exception으로 하면 이런 문제를 해결할 수 있다.

아래 예시처럼 부모인 Exception이 가장 나중에 와야함.

(단, 예외 처리의 범위가 작은 것 부터 와야함.)

		catch (ArithmeticException e) {
		}
		// ..
		// ..
		// ..
		catch (Exception e) {
		}

finally

  • finally로 감싸져 있을 경우 예외 발생 여부와 상관 없이 무조건 실행된다.
		catch (ArithmeticException e) {
		}
		catch (Exception e) {
		}
		finally {
			System.out.println("무조건 실행 됌");
		}

메소드에서 예외 처리하는 두가지 방법

1. 호출 당한 메소드 안에서 직접 try ~ catch 처리

호출당한 calcDiv() 에서 예외처리

	public static void calcDiv(int a, int b) {
		
		try {	
			int div = a/b;
			System.out.println("나누기 결과: "+div);
		}
		catch(ArithmeticException e) {
			System.out.println("0으로 나눌 수 없어요");
		}
	}

2. 메소드를 호출하는 쪽에 예외처리를 맡긴다 (throws 사용)

  • 해당 메소드 맨 뒤에 [throws 예외클래스] 를 추가하여 예외처리를 호출한 쪽에 맡기기
public static void 메소드명 throws 예외클래스명1, 예외클래스명2{

호출한 main()에서 직접 예외처리

	public static void calcDiv(int a, int b) throws ArithmeticException {
	
		int div = a/b;
		System.out.println("나누기 결과: "+div);
		System.out.println("0으로 나눌 수 없어요");
	}
	
	public static void main(String[] args) {

		try {
			calcDiv(9,3);
		}catch (ArithmeticException e) {
			System.out.println("0으로 나눌수 없어요!");
		}
	}

RuntimeException 과 이외의 예외처리 특성

1. RuntimeException

예외처리의 종류는 크게 RuntimeException 이냐 아니냐로 나눌 수 있다.
  • RuntimeException의 자식들은 사용자가 예외처리를 하지 않아도 컴파일이 가능하고 자바가 예외처리를 해줍니다.
  • 물론, 필요하다면 사용자가 직접 예외처리를 할 수도 있음
  • 실행이 된다는 것 자체가 자바가 예외처리를 해준거임 (에러가 나와도 에러가 나오는 거 자체가 예외처리 된거임)

예시) ArithmeticException은 RuntimeException의 후손

2. RuntimeException 이 아닐 경우

  • 그러나 RuntimeException의 자식이 아닌 것들은 사용자가 반드시 직접 예외처리를 해야한다.
  • 만약 사용자가 직접 예외처리를 하지 않으면 컴파일이 되지 않는다.

예시) IOException

public FileWriter(String fileName) throws IOException
  • FileWriter 예외처리시 사용되는 IOException은 RuntimeException 자식이 아니기 때문에 필수적으로 예외처리를 해줘야한다. (IOException)

  • IOExcepton은 바로 Exception을 상속 받음

FileWriter 실행 시 에러 (예외처리 안해서)

IOException 예외처리 완료

아래 예시 IOException은 RuntimeException의 자식이 아니므로 try  ~ catch로 직접 예외해줘야함

		try {			
			FileWriter fw = new FileWriter("c:/temp/hello.txt");
			fw.write("hello java");
			fw.close();
			System.out.println("파일이 생성되었습니다.");
		}catch(IOException e) {
			System.out.println("예외가 발생");
			System.out.println(e.getMessage());
		}

강제로 예외 발생 시키기 (throw)

  • 때로는 강제로 예외를 발생시켜야 할 경우도 존재하는데 그때는 throw 키워드를 사용 (throws랑 헷갈리지 말것)
  • 강제로 예외 발생시켰는데 RuntimeException의 자식이 아니면 당연히 try ~ catch 로 예외처리 해야함
throw new 예외클래스이름("메세지 입력 가능");
        System.out.println("hello");
        throw new ArithmeticException();

throws - 메소드 안에서 예외 발생 시 메소드를 호출한 쪽에서 예외처리를 할 수 있도록 하는 키워드

throw - 강제로 예외를 발생 시키는 키워드


사용자 정의 예외 만들기

  • 예외 처리 클래스를 생성
  • throw new [예외처리클래스이름]
class 예외클래스이름 extends Exception{
    생성자(String msg){
          super(msg);
    }
}
class NotFoundException extends Exception {
	public NotFoundException(String msg) {
		super(msg);
	}
}
반응형

'개발 > 자바' 카테고리의 다른 글

자바 컬렉션 (Set, List, Map)  (0) 2022.04.09
p370) 3번 문제 - 가위바위보  (0) 2022.04.07
Wrapper 클래스  (0) 2022.04.07
char - int (다른 자료형 끼리 연산)  (0) 2022.04.07
자바 String 처리 방법  (0) 2022.04.07

댓글