예외 Exception
예외란 실행시에 발생할 수 있는 모든 에러상황들을 말한다.
예외는 객체이기 때문에 클래스로 정의되어 있으며, 예외는 '던진다' 라고 표현한다.
자바는 예외를 목적에 따라서 처리(핸들링)하도록 설계되어있다.
즉, 예외가 발생한다고 해서 바로 프로그램을 비정상 종료시킬 수도 있고,
예외처리를 통해 프로그램을 종료하지 않고 정상실행상태가 유지되도록 할 수 있다.
특정 API는 컴파일시 예외를 처리하지 않으면 컴파일 되지 않는 예외들도 있다.
자바에서 예외가 발생되는 순서
컴파일
→ 실행
→ 실행중 예외 발생
→ VM이 발생한 예외의 종류 및 내용을 파악한 뒤 예외 객체 생성
→ 발생된 코드 밖으로 예외 던지기(throw)
→ 예외의 콜 스택에 전이
→ main메소드 밖까지 던지게 되면 프로그램 비정상 종료
예외의 상위 클래스는 Throwable
예외의 최고 클래스는 lang패키지의 Throwable이며, Throwable의 자식 클래스로는 Error와 Exception이 있다.
- 에러 Error
'컴퓨터 하드웨어의 오작동 또는 고장으로 인해 응용프로그램 실행오류가 발생하는 것'
에러는 JVM 실행에 문제가 생겼다는 것이므로 JVM위에서 실행되는 프로그램을 아무리 견고하게 만들어도 결국 실행 불능이 된다. 개발자는 이러한 에러를 극복할 방법이 없다.
- 예외 Exception
예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말한다. 예외가 발생해도 프로그램은 바로 종료된다. 그러나 에러와는 달리 예외는 '예외처리'라는 것을 통해 프로그램을 종료하지 않고 정상실행상태가 유지되도록 할 수 있다.
※예외의 종류
- 알려지지 않는 예외 (Unchecked Exception)
컴파일러가 관여하지 않는 예외 (실행시에 예외가 발생할수도 발생하지 않을수도 있는 예외 - 알려진 예외(Checked Exception)
컴파일러가 관여하는 예외. 따라서 Checked Exception이 발생할 수 있는 메소드라면 반드시 try/catch 구문으로 감싸주어야 한다. 그렇지 않으면
가장 쉽게 구분하는 방법
Exception하위 클래스 중 RuntimeException이 있는데,
해당 클래스의 자식 클래스들은 모두 알려지지 않은 예외이다.
나머지는 알려진 예외이다.
- 알려지지 않는 예외 (Unchecked Exception)
예외 처리 방법
try를 활용하여 오류를 막고 다른 부분까지 실행되게 할 수 있다.
1. 예외 복구
예외가 발생하여도 정상적으로 실행되도록 하는 것이다.
try{
예외가 발생할만한 코드;
}catch(예외종류 e){
예외가 발생하면 실행할 코드;
}finally{
예외 발생유무와 상관없이 반드시 실행해야 할 코드;
}
2. 예외 회피
메소드 뒷부분에 throw 처리할 예외타입을 적어주면
메소드가 실행되다가 예외를 만나면 메소드를 호출한쪽으로 예외를 던진다.
main메소드의 경우 VM으로 던진다.
3. 직접 예외 객체 만들어서 처리하기
예외 객체를 만들어서 처리하기
throw 객체명;
@override
public void printStrackTrace(){
super.printstrackTrace();
System.out.println("계산 불가");
}
EX01. Exception e
Exception e → try { } 구문에서 어떤 예외든 발생한다면,
catch (Exception e) { } 구문을 실행한다.
public class Exception01 {
public static void main(String[] args) {
int[] ia = new int[5];
try {
System.out.println(ia[0]);
System.out.println(ia[1]);
System.out.println(ia[2]);
System.out.println(ia[3]);
System.out.println(ia[5]);
} catch (Exception e) {
System.out.println("예외가 발생했으나");
System.out.println("너구리가 처리했다구");
}
System.out.println("완료. 프로그램 종료합니다.");
}
}
출력결과:
0
0
0
0
예외가 발생했으나
너구리가 처리했다구
완료. 프로그램 종료합니다.
→ 예외가 발생했음에도 비정상 종료되지 않고, 예외처리 구문을 실행시키며 정상실행상태를 유지한다.
EX02. 예외가 여러 개인 경우
try{ } 속에서 예외 발생 이후 코드들은 읽히지 않는다.
따라서 이 예시처럼 ArrayIndexOutOfBoundsException이 먼저 발생한 경우, 예외 발생 이후 코드인
System.out.println(10/0);
System.out.println("try문장 속 입니다.");
이 두 문장은 영원히 실행되지 않는다.
public class Exception02 {
public static void main(String[] args) {
try {
int[] ia = {10, 20, 30, 40, 50};
System.out.println(ia[5]); //ArrayIndexOutOfBoundsException 발생
//예외 발생 이후 코드들은 읽히지 않는다.
System.out.println(10/0);
System.out.println("try문장 속 입니다.");
} catch (ArithmeticException e) {
System.out.println("0으로 나누려고 시도 중 예외 발생"); //10/0이 실행되지 않으므로 예외도 발생X
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("배열 길이 초과");
} finally {
System.out.println("finally{ } 예외 발생과 상관없이 실행하는 구문");
}
System.out.println("프로그램 종료");
}
}
출력결과
배열 길이 초과
finally{ } 예외 발생과 상관없이 실행하는 구문
프로그램 종료
EX03. 예외가 여러 개인 경우 - 2
try{ } 속에서 예외 발생 이후 코드들은 읽히지 않기 때문에,
이를 방지하기 위해서는 아래와 같이 try{ } 구문을 여러 개 사용해야 한다.
package exception;
public class Exception03 {
public static void main(String[] args) {
//Exception02랑 무슨 차이?
try {
try {
int[] ia = new int[5];
ia[5] = 100;
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("배열 길이 초과");
}
System.out.println(10 / 0);
} catch (ArithmeticException e) {
System.out.println("0으로 나누는 오류");
} finally {
System.out.println("프로그램 종료");
}
}
}
출력결과
배열 길이 초과
0으로 나누는 오류
프로그램 종료
EX04. 파일 불러오기 예외
FileReader 이용하기
package exception;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.annotation.processing.FilerException;
public class Exception05 {
public static void main(String[] args) {
FileReader fr = null;
try {
fr = new FileReader("C:\\workspace\\Hello.java");
int data;
while (true) {
data = fr.read();
if(data == -1) {
break;
} else {
System.out.print((char)data);
}
}
} catch (Exception e) {
System.out.print("파일을 찾을 수 없습니다.");
} finally {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("끝");
}
}
출력결과
- 찾는 파일이 있는 경우:
파일 출력
끝 - 찾는 파일이 없는 경우:
파일을 찾을 수 없습니다.
끝
'BackEnd > Java' 카테고리의 다른 글
[Java] IO Stream (0) | 2021.07.26 |
---|---|
[Java] 내부 클래스 Inner Class (0) | 2021.07.22 |
[Java] 2진트리 Binary Tree (0) | 2021.07.19 |
[Java] 스택(Stack), 큐(Queue) (0) | 2021.07.19 |
[Java] 맵 Map (0) | 2021.07.19 |
댓글