티스토리 뷰
프로그래밍을 하다 보면 빨간 줄이 죽죽 그어있고 돌렸는데 에러가 나고 하는 경우가 많다. 이 에러들의 종류와 어떻게 처리할 것인지에 대해 정리해보고자 한다!
발생 시점에 따른 에러(Error)의 구분
● 컴파일 에러 : 소스코드 컴파일 시에 발생한다. 주로 문법적인 에러이며 코드를 수정해야 한다.
ex) ’;’ 이 누락 , {} 괄호가 맞지 않는 등의 구문 에러
● 런타임 에러 : 프로그램 실행 중에 발생한다. 수행할 수 없는 작업을 시도할 경우에 발생하며 코드를 수정해야 한다.
ex) 값이 없어서 읽어올 수 없는 경우(NullPointerException) , 무한루프 , 0으로 나누는 경우(ArithmeticException) 등
● 시스템 에러 : 컴퓨터 시스템상의 에러로 소스코드로는 해결할 수 없는 장비 또는 os 관련 에러이다.
예외(Exception)
: 프로그램 실행 도중 발생하는 것으로 에러 메시지를 표시하고 중단된다. 그러므로 예외는 런타임 에러에 속한다. 예외는 여기서 또 Checked Exception , Unchecked Exception 2가지로 나눠진다.
→구체적으로 나누자면 이렇게 되고 보편적인 의미로 에러는 "소스코드로 해결할 수 없는" 예외는 "소스코드 수정으로 처리가 가능한"으로 구분된다.
● Checked Exception : RuntimeException을 상속하지 않는 클래스로 소스코드 상에서 반드시 처리해줘야 한다.
● Unchecked Exception : RuntimeException을 상속하는 클래스로 소스코드 상에서 처리하지 않아도 된다.
+흔히 발생하는 IndexOutOfBoundsException도 Unchecked Exception에 포함된다.
예외처리(Exception Handling)
이제 Exception을 다루는 방법을 알아보자. 예외처리의 기본 구문은 try~catch~finally이다. 이걸 통해 발생하는 코드에 대해 직접 처리해 주기도 하고 throws를 통해 이전 호출 위치에서 처리하도록 넘기는 방법이 있다.
우리는 이 Exception클래스를 상속받아 직접 예외 클래스를 만들기도 발생시키는 것 역시 가능하다.
try{
//예외 발생 가능성이 있거나, 예외를 반드시 처리해야하는 코드 작성부
}catch(처리할 예외 클래스명 객체 1){
//예외 상황 1에 대한 처리코드
}catch(처리할 예외 클래스명 객체 2){
//예외 상황 2에 대한 처리코드
}
...
finally{
//예외가 발생하던 안하던 반드시 실행되는 코드
}
기본적인 예외 처리 방식은 이렇게 된다. 이제 코드로 몇 가지의 예외처리 방법을 알아보자! finally는 사용을 안해도 무방하다.
먼저 코드에서 예외를 직접 처리해주는 방식이다.
public static void main(String[] args) {
try {
//예외가 발생할 수 있는 구문
Scanner sc = new Scanner(System.in);
System.out.print("정수1 : ");
int num1 = sc.nextInt();
System.out.print("정수2 : ");
int num2 = sc.nextInt();
int result = num1 / num2;
System.out.printf("%d/%d=%d%n", num1, num2, result);
} catch (InputMismatchException e) {
System.out.println("경고 >> 정수값만 입력하셔야 합니다.");
} catch (ArithmeticException e) {
System.out.println("경고>> 정수2는 0일수 없습니다.");
} catch (Exception e) {
//다형성 적용 : 상속관계에 예외클래스를 나열할때는 자식 - 부모 순서여야한다.
System.out.println("모든 예외객체를 처리하는 구문입니다!!!!");
}
}
여기서 생기는 Exception에는 2가지를 명시하여 나타낼 수 있다. 정수 값만 입력했는지와 0으로 나누는지 try에서 발생한 예외를 catch에서 잡아서 처리해주는 코드이다. 여기서는 print문으로 오류의 이유를 설명하고 있다.
여기서 중요하게 살펴볼 점은 catch의 Exception 순서! 만약 Exception e를 catch 줄 가장 위쪽에 쓴다면 컴파일 에러가 난다. 모든 예외가 Exception을 상속하므로 여기서 다 걸리기 때문에 아래쪽에서 ArithmeticException e는 실행될 수 없기 때문이다. 그러므로 여러 개의 catch문을 작성할 때는 최하위 후손 클래스부터 기술해주기!
다음으로는 thorws를 통해 예외를 위임하는 예를 살펴보자 위임에는 예외처리를 직접 하지 않고 던지는 것과 직접 예외처리 후 사용자 정의 예외 클래스를 통해 예외를 다시 던지는 것 두 가지의 방법이 있다.
아래 코드로 간단하게 살펴보자.
-실행 클래스 Run.java
public class Run {
public static void main(String[] args) {
new Run().test();
}
public void test() {
Scanner sc = new Scanner(System.in);
System.out.print("문자열을 입력하세요 : ");
try {
String s = sc.nextLine();
CharacterProcess cp = new CharacterProcess();
System.out.println(cp.countAlpha(s));
} catch (CharCheckException e) {
//에러메세지만 출력!
System.out.println(e.getMessage());
}
}
}
-예외를 발생시키고 던지는 클래스. CharacterProcess.java
public class CharacterProcess {
public int countAlpha(String s) throws CharCheckException {
if(s.indexOf(" ") > -1)
throw new CharCheckException("체크할 문자열 안에 공백 포함할 수 없습니다.");
int cnt = 0;
for(int i=0; i<s.length(); i++) {
if(Character.isUpperCase(s.charAt(i)) || Character.isLowerCase(s.charAt(i)))
cnt++;
}
return cnt;
}
}
-사용자 정의 예외 클래스. CharCheckException.java
public class CharCheckException extends Exception {
public CharCheckException(String msg){
super(msg);
}
}
실행 순서
1. try에서 실행 클래스에서 공백이 포함된 문자열을 입력 -Run.java
2. CharacterProcess 클래스 객체에 담겨 countAlpha() 실행 - CharacterProcess.java
3. 공백이 포함되어 있으므로 미리 정의된 예외 클래스를 이용해 예외를 발생시킴 -CharacterProcess.java
4. 사용자 정의 예외 클래스에서 생성자 인자로 받은 msg를 부모 생성자를 통해 전달 여기서 getMassge()를 부를 경우 msg에 해당하는 내용이 나오게 됨 - CharCheckException.java
5. 해당 메서드에서 처리하는 게 아닌 throws를 통해 실행 메서드를 부른 곳으로 돌아감 -CharacterProcess -> Run
6. catch에서 CharCheckException으로 걸려서 에러 메시지를 표시하게 됨 -Run.java
코드가 복잡해질수록 다양한 예외가 나올 수 있으니 알맞게 알맞은 상황에서 예외를 처리하는 방법을 익혀야겠다!
참고자료
https://madplay.github.io/post/java-checked-unchecked-exceptions
'언어 > java' 카테고리의 다른 글
[java] Map-getOrDefalut() 사용법 (0) | 2021.01.28 |
---|---|
[JVM구조]JVM으로 보는 java 프로그램의 실행 과정 (0) | 2020.12.25 |
[java.io.StreamCorruptedException: invalid type code: AC ]객체단위 쓰기/읽기 에러 (2) | 2020.06.04 |
[java]Comparable/Comparator 사용법,차이 (0) | 2020.05.25 |
[이클립스] getter/setter,생성자 자동생성(java) (0) | 2020.05.14 |
- Total
- Today
- Yesterday
- OS
- programers
- MST
- sockjs
- websocket
- 알고리즘
- 백준
- 채팅
- git
- Spring
- Baekjoon
- 분리 집합
- Stomp
- 삼성 sw역량 테스트
- BFS
- 삼성 sw역량테스트
- 완전탐색
- java
- Oracle
- 운영체제
- DP
- 코딩테스트
- JavaScript
- dfs
- 프로그래머스
- Heap
- 최소 스패닝 트리
- 정렬
- 자바
- SWEA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |