일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 파헤쳐보자
- 노드
- ngrinder
- Stream
- 스크럼
- 노드js
- Groovy
- 이벤트 루프
- node.js
- 자바
- Django
- 소켓
- 지식 그래프
- benchmark
- socket.io
- 스크럼 마스터
- node
- RDF
- C++
- 개발자
- scrum
- Router
- 예제
- java
- nodejs
- 특징
- Python
- express
- Knowledge Graph
- 스레드
- Today
- Total
라봉이의 개발 블로그
java의 정석 8강. 예외처리(상) 본문
1. 예외처리
1.1 프로그램 오류
프로그램 오류는 컴파일 에러와 런타임 에러가 있는데 그 중 런타임 에러는 에러와 예외, 2가지 종류가 있다.
에러: 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외: 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
1.2 예외처리의 정의와 목적
프로그램 실행도중에 발생하는 에러는 발생하면 복구할 수 없는 심각한 오류지만, 예외는 이에 대한 처리를 미리하면 프로그램의 비정상 종료를 막을 수 있다.
1.3 예외처리구문 try-catch
예외를 처리하기 위한 구문은 다음과 같다.
try {
// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception1 e1) {
// Exception1이 발생했을 경우, 이를 처리하기 위한 문장 넣는다.
} catch (Exception2 e2) {
// Exception2가 발생했을 경우, 이를 처리하기 위한 문장 넣는다.
}
...
} catch (ExceptionN eN) {
// ExceptionN 이 발생했을 경우, 이를 처리하기 위한 문장 넣는다.
}
catch문이 여러개 있지만 이 중 발생하는 예외의 종류와 일치하는 단 한 개의 catch 블럭만 수행된다.
예제 1)
public class Main {
public static void main(String[] args) {
try {
} catch (Exception e) {
try {
} catch (ArithmeticException e) { // 에러: 같은 이름의 참조변수를 사용함
}
}
}
}
위의 예제는 catch 블럭 내에 try-catch문이 포함된 경우, 같은 이름의 참조변수를 사용했기 때문에 오류가 났다. 각 catch 블럭에 선언된 두 참조변수의 영역이 서로 겹치기 때문에 다른 이름을 사용해서 구별해야한다.
예제 2)
public class Main {
public static void main(String[] args) {
int number = 100;
int result = 0;
for(int i = 0; i < 10; i++) {
result = number / (int)(Math.random() * 10);
System.out.println(result);
}
}
}
실행결과:
16
33
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.company.Main.main(Main.java:9)
위의 예제는 Math.random() 값이 어쩌다 0이 나와서 number를 0으로 나누었기 때문에 생기는 예외이다.
number를 0으로 나누려 했기 때문에 ArithmeticException이 발생했고 발생위치는 Main.java 파일의 9번째 줄이라는 것을 알 수 있다.
어디서 왜 일어났는 지 알았기 때문에 이번엔 try-catch를 추가하여 예외처리를 해보자.
public class Main {
public static void main(String[] args) {
int number = 100;
int result = 0;
for(int i = 0; i < 10; i++) {
try{
result = number / (int)(Math.random() * 10);
System.out.println(result);
} catch (ArithmeticException e){
System.out.println("0");
}
}
}
}
이제는 Math.random()이 0이 나오게 되면 catch 구문으로 들어가서 0을 출력하게 되고 계속해서 for문을 동작하게 된다.
예외처리 하지 않았다면 0이 나오는 순간 프로그램은 비정상 종료를 할 것이다.
1.4 try-catch문에서의 흐름
public class Main {
public static void main(String[] args) {
System.out.println(1);
try {
System.out.println(2);
System.out.println(3/0);
System.out.println(4);
} catch (Exception e) {
System.out.println(5);
}
System.out.println(6);
}
}
출력 결과:
1
2
5
6
try문에서 오류가 생기자마자 바로 catch 문으로 넘어가기 때문에 4는 출력이 되지 않는다.
1.5 예외 발생시키기
키워드 throw를 사용해서 프로그래머가 고의적으로 예외를 발생시킬 수 있다. 방법은 다음과 같다.
먼저 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음
Exception e = new Exception("고의로 발생시킴");키워드 throw를 이용해서 예외를 발생시킨다.
public class Main {
public static void main(String[] args) {
try {
Exception e = new Exception("고의로 발생시킴");
throw e;
} catch (Exception e) {
System.out.println("에러 메세지: " + e.getMessage());
e.printStackTrace();
}
System.out.println("프로그램이 정상 종료되었음");
}
}
에러 메세지: 고의로 발생시킴java.lang.Exception: 고의로 발생시킴at com.company.Main.main(Main.java:6)프로그램이 정상 종료되었음
- RuntimeException클래스와 그 자손클래스들
- Exception클래스와 그 자손클래스들
'Java > Java의 정석 읽고 정리' 카테고리의 다른 글
java의 정석 9강. java.lang 패키지(상) (0) | 2018.06.11 |
---|---|
java의 정석 8강. 예외처리(하) (0) | 2018.06.07 |
java의 정석 7강. 객체지향프로그래밍2(하) (0) | 2018.06.03 |
java의 정석 7강. 객체지향프로그래밍2(중) (0) | 2018.06.01 |
java의 정석 7강. 객체지향프로그래밍2(상) (0) | 2018.05.29 |