프로그램의 에러는 크게 컴파일 에러, 런타임 에러, 논리적 에러가 있다.
자바에서의 런타임 에러에서 오류(Error)는 로직 상에서 수습될 수 없는 심각한 오류를 말하고, 예외(Exception)는 로직 상에서 수습될 수 있는 미약한 오류를 말한다.
예외(Exception)
예외(Exception)는 정상적이지 않은 케이스를 의미한다.
컴파일 시에 검사가 가능한 Checked Exception(사용자들로부터 발생하는 예외), 불가능한 Unchecked Exception(개발자의 실수로부터 발생하는 예외, Nullpointer, Arithmetic )이 있다.
예를 들어, 0으로 나누거나 배열의 인덱스 초과, 없는 파일 열기 등이 있다.
예외처리(Exception Handling)
예외처리는 try-catch, try-catch-finally 문을 통해 해결하곤 한다.
여기서는 ;을 쓰지 않는다. try 부분에서 해당 예외 case가 발생하면 catch에서 잡아서 catch 내부를 실행한다. finally는 예외 발생 여부와 관계없이 무조건 실행되는 부분을 넣는 것이다. 그래서 예외가 발생할 것 같은 부분을 try에 넣고 항상 실행되는 부분을 finally에 넣게된다. 예외처리를 위한 catch 부분에서 프로그램을 종료하지 않으면 계속 넘어간다.(원래 예외 발생시 프로그램이 강제로 멈추는 경우가 있다.)
여기서 catch(예외 case)의 ()안에는 에러타입 e 같이 무슨 예외든 e를 이용한다. e는 변수로 e가 아닌 아무거나 사용해도 상관없지만 대부분 e를 사용한다.
throw, throws
throw - 예외를 강제로 발생시키는 것이다.
Exception exception = new Exception("파일없음"); // 발생시키려는 예외 객체 생성
throw new exception; 같이 쓴다.
Exception()은 모든 예외의 부모클래스다.
throws - 예외를 다음으로 전가시키는 것이다.
메소드이름() throws Exception{} 같이 사용한다.
함수 내부에서 발생하는 어떤 예외든 발생하면 이 예외가 그냥 바깥으로 전달되는 것을 말한다. 그래서 함수가 호출한 쪽에서 예외를 처리할 수 있도록 해주는 것이다. throw와 마찬가지로 특정 예외만 써서 보내는것도 가능하다.
public class 위에 이런식으로 원래는 존재하지 않는 나만의 Exception을 만들어 줄수도 있다. (쓸 때는 throw new NotTenException()같이 사용한다)
이 경우 Exception 혹은 RuntimeException 클래스를 상속받아 만들게 된다.
try - with - resource 문
JDK 1.7부터 사용한 자원을 자동으로 해제해주는 것이다. try()안에 사용할 자원을 할당하는 명령문을 적으면 try-catch가 끝나는 시점에 맞춰 자동으로 자원을 반환하게 된다. 이때 사용하는 자원은 auto closable 인터페이스를 구현한 클래스로 내부적으로 close 메소드를 호출하게 된다.
자동으로 호출되는 것이라고 보면 된다. 아래같은 느낌이다.
public class Main {
public static void main(String[] args) {
String fileName="test.txt";
try(FileReader fr=new FileReader(fileName);
BufferedReader br=new BufferedReader(fr)){
br.readLine();
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
예외 종류
InputMismatchException - 원하는 타입의 입력이 들어오지 않았을 때 일어나는 예외(nextInt()인데 문자열이 들어온다던가)