[Java] 예외처리
CS 스터디를 하면서 공부했던 Java Exception에 대해 정리해보았다.
목차
2. Checked Exception vs UnChecked Exception
Java Throwable
Throwable이란
- Java의 오류 및 예외 계층에 대한 루트 역할
Error 와 Exception
- error는 프로그램 코드로 처리할 수 없는 심각한 상황(시스템 자원 부족, 스택 오버플로우, 시스템 충돌 등)
- exception은 프로그램의 코드로 처리 할 수 있는 예외적인 상황
Checked Exception vs UnChecked Exception
Checked Exception
- 예외처리가 되어있지 않으면 컴파일이 되지 않는 exception, 즉 무조건 체크해야 되는 exception
RuntimeException
와 그 자식 클래스를 제외한 나머지 클래스들 (IOException
,FileNotFoundException
등등)
UnChecked Exception
- 예외처리가 되어있지 않아도 컴파일은 되는 exception, 즉 예외처리가 개발자의 재량인 exception
RuntimeException
을 포함한 그 자식 클래스들
예외 처리
try-catch
- Checked Exception을 처리해주기 위해 사용하는 문법
try { 예외처리가 필요한 코드 } catch(예외클래스 e) { 예외가 발생했을 때 실행할 코드 } finally { 예외가 발생했든 안했든 무조건 실행할 코드 }
try-with-resource
- 리소스 작업을 하는 코드의 예외처리를 도와주는 문법 자동
close
작업을 해준다.try (FileWriter f = new FileWriter("data.text")) { f.write("Hello"); } catch(IOException e) { e.printStackTrace(); }
- 파일 입출력해주는 클래스는 무조건
close()
를 실행시켜주어야 한다. 하지만 클래스에AutoCloseable
인터페이스가 구현되어 있으면 try-with-resource 문법을 통해 위 코드처럼 닫는 것을 명시해주지 않아도 된다. (AutoCloseable
이 알아서 close해준다.) - 사용하기 위해선 try문에 매개변수를 넣어주면 된다.
throws
- 메소드에서 잠재적으로 어떤 예외가 발생할 수 있는지 명시해주는 키워드
- checked exception을 try-catch로 처리해주지 않으려면 사용해주면 된다.
throw
- 예외를 명시적으로 발생시키는 키워드
- 발생시킨 예외를 적절히 처리하지 못하면 프로그램이 죽거나 오동작하게 됨
예외 처리 가이드
예외는 진짜 예외 상황에만 사용
예외 사용의 나쁜 예시
try {
int i = 0;
while(true)
range[i++].climb();
} catch (ArrayIndexOfBoundsException e) {
~~~
}
검사(Checked) 예외를 비검사(UnChecked) 예외로 전환
try {
String str = null;
System.out.println(str.toString());
} catch (NullPointerException e) {
System.out.println("--NullPointerException 발생--");
} finally {
System.out.println("예외처리 코드가 오류없이 진행되었습니다.");
}
String str = null;
if(str != null) {
System.out.println(str.toString());
} else {
//예외처리
}
표준 예외를 사용
- Why?
- 타인이 봤을 때 예외를 이해하기 쉬움 (표준으로 만들어진 예외이기 때문)
- 재사용하기 좋은 예외들
IllegalStateException
: 대상 객체의 상태가 호출된 메서드를 수행하기 적합하지 않을 경우IllegalArgumentException
: 호출자가 인수로 부적절한 값을 넘기는 경우ConcurrentModificationException
: 단일스레드에서 사용하려고 설계한 객체를 여러 스레드에서 동시 수정하려 할 경우IndexOutOfBoundsException
: 인덱스가 범위를 넘어섰을 떄
- 표준 예외를 오버라이딩해서 사용하면 다른 사람이 익히고 사용하기 쉬워짐
- 단
Exception, RuntimeException, Throwalbe, Error
는 직접 오버라이딩 하지 않는게 좋음
댓글남기기