예외 (exceptional event)
- 잘못된 코드, 부정확한 데이터, 예외적인 상황에 의해 발생하는 오류
- 예) 0으로 나누는 것과 같은 잘못된 연산이나 배열의 인덱스가 한계를 넘을 수도 있고, 디스크에서는 하드웨어 에러가 발생할 수 있다.
- 대부분의 경우, 예외가 발생하면 프로그램이 종료된다. 그러나 무조건 종료하는 것보다 프로그램에서 사전에 오류를 처리하도록 한 후에 실행한다면 더 나은 프로그램이 될 수 있다. 이것을 예외처리라고 한다.
프로그램 오류
- 컴파일 에러 : 컴파일할 때 발생하는 에러
- 런타임 에러 : 실행할 때 발생하는 에러
JAVA의 런타임 에러 - 에러(error)와 예외(exception)
에러는 어쩔 수 없지만, 예외는 처리해야 한다.
에러(error) -> 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외(exception) -> 프로그램 코드에 의해서 수습될 수 있는 미약한 오류
예외처리의 정의와 목적
정의 -> 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것
목적 -> 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것
<강제 예외>
고의적으로 0으로 나누어서 강제적으로 예외를 발생시킨다.
예외 처리기
try 블럭은 예외가 발생할 수 있는 위험한 코드이고, catch블럭은 예외를 처리하는 코드이다.
예외 처리기의 기본 형식
try {
// 예외가 발생할 수 있는 코드
} catch (예외종류 참조변수) {
// 예외를 처리하는 코드
}
finally {
// 여기 있는 코드 try 블록이 끝나면 무조건 실행된다. 생략이 가능하다.
}
<예외처리 1>
0으로 나누는 예외를 발생시켜 예외처리한다.
<예외처리 2>
배열의 크기를 벗어나는 경우에 발생되는 예외를 처리한다.
<예외처리 3>
예외가 발생하지 않은 경우 (Exception : 정확한 예외의 이름은 모를 경우에 사용)
<예외처리 4>
- try블럭에서 예외가 발생하면, 발생한 예외를 처리할 catch블럭을 찾는다. 첫번째 catch블럭부터 순서대로 찾고, 일치하는 catch블럭이 없으면 예외는 처리되지 않는다.
- 예외의 최고 조상인 Exception을 처리하는 catch블럭은 모든 종류의 예외를 처리할 수 있다. (반드시 마지막 catch블럭이어야 한다.)
finally 블럭
- 오류 발생과 상관없이 항상 실행되어야 하는 코드는 finally 블럭에 넣는다.
- 선택적으로 사용할 수 있으며, try-catch-finally의 순서로 구성된다.
- 예외가 발생한 경우 : try -> catch -> finally의 순서로 실행
- 예외가 발생 안한 경우 : try -> finally의 순서로 실행
- try 또는 catch블럭에서 return문을 만나도 finally블럭은 수행된다.
<finally 블럭 1>
예외가 발생한 경우
<finally블럭 2>
예외가 발생 안한 경우
예외의 종류
Error : 자바 가상 기계 안에서 치명적인 오류가 발생
RuntimeException : 프로그래밍 버그나 논리 오류에서 발생한다.
<예외를 처리하는 방법>
① 예외를 잡아서 그 자리에서 처리하는 방법 : 해당 메서드 안에서 try - catch 블럭을 사용하여 예외를 잡고 처리한다.
② 메소드가 예외를 발생시킨다고 기술하는 방법 : 메서드가 발생되는 예외를 바로 처리하지 않고, 자신을 호출한 상위 메서드로 예외를 전달하는 방법. throws를 사용하여 다른 메서드한테 예외 처리를 맡긴다.
예외 생성하기
- 예외는 throw 문장을 이용하여 생성한다.
- new 키워드로 생성하고, throw키워드로 발생시킨다.
1.먼저, 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음
Exception e = new Exception("고의로 발생시켰음");
2.키워드 throw를 이용해서 예외를 발생시킨다.
throw e; throw new Exception("고의로 발생시켰음");
<예외 생성 1>
Exception 인스턴스를 생성할 때, 생성자에 문자열을 넣어주면 Exception 인스턴스에 메시지로 저장된다. 이 메시지는 getMessage()와 printStackTrace()를 사용하여 출력할 수 있다.
<예외 생성 2>
참조변수 ae를 통해 생성된 ArithmeticException인스턴스에 접근할 수 있다.
예외 클래스의 계층구조
- 예외 클래스는 크게 두 그룹으로 나뉜다.
RuntimeException클래스들 -> 프로그래머의 실수로 발생하는 예외 <-예외처리 선택
Exception클래스들 -> 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외 <- 예외처리 필수
- RuntimeException 클래스들 : 배열의 범위 벗어나는 것, 값이 null인 참조변수의 멤버를 호출하는 것, 클래스간의 형변환을 잘못한 것, 정수를 0으로 나누려고 하는것 등
- Exception 클래스들 : 존재하지 않는 파일의 이름을 입력한 것, 실수로 클래스의 이름을 잘못 입력한 것, 데이터 형식이 잘못된 것 등
<예외 클래스 1>
컴파일 단계에서 발생하는 오류
<예외 클래스 2>
try ~ catch문으로 예외처리를 해주어야 컴파일이 성공적으로 된다.
<예외 클래스 3>
예외처리를 하지 않았지만 컴파일은 성공적으로 된다. 하지만 파일을 실행하면 아래와 같이 RuntimeException이 발생하여 비정상적으로 종료된다. RuntimeException 클래스들은 예외처리를 해주지 않아도 컴파일러가 문제삼지 않는다.
'Web Programming > java-jsp' 카테고리의 다른 글
java 문자열 오버플로우 형변환 특수문자 (0) | 2018.08.29 |
---|---|
java 변수 기본형 자료형 (0) | 2018.08.29 |
JAVA Method 클래스 (0) | 2018.08.29 |
Spring PostConstruct 어노테이션 (0) | 2018.08.29 |
[자바][Java] DecimalFormat 클래스 (0) | 2018.08.28 |