일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- for문
- 프로그래머스
- 독학
- do~while문
- 개발
- 클래스의구조
- 취준생
- 비전공자
- 가위바위보프로그램
- Java
- 코딩
- 예외던지기
- Date Class
- userDefineException
- 개발자
- 국비지원
- 사용자 정의 예외처리
- exception
- 부모 생성자
- AoutoBoxing
- 백앤드
- 캐스팅연산자
- 생성자
- 알고리즘
- super 생성자
- 추상화
- Calendar Class
- 자바
- 상속
- 예외처리
- Today
- Total
유난스런 개발 기록
[JAVA] Day-17 _ 예외처리 (Exception) 본문
day-17
예외처리 (Exception)
예외처리 (Exception) 이란 ?
- 예외처리란 말 그대로 예상되는 예외를 지정해주고, 지정한 예외가 발생하면 알맞게 처리해 주는 것을 말한다.
- 예외는 쉽게 말하자면 error 인데, 에러가 발생하면 프로그램은 작동을 멈추게 된다.
- 예외 처리를 해준다면 프로그램은 멈추지 않고 정상 작동을 이어간다.
사실 예외처리는 수업시간에 따로 편성이 되어있었지만, 계속해서 써왔기 때문에 낯설지 않았다.
자바에서는 java.lang.Exception 클래스를 제공하여 예외처리를 할 수 있도록 해준다.
예외처리를 할 때 꼭 기억해야할 것이 있다.
예외 처리를 하다보면 여러개의 예외처리를 사용할 때가 있는데,
특히 부모 클래스와 자식 클래스의 익셉션을 처리할 때 오류를 범할 가능성이 높다.
쉽게 말하자면, 다중 catch 문을 사용할 때
상위 클래스의 예외처리가 가장 아래에 나와야한다.
만약 상위 클래스의 예외처리가 하위 클래스의 예외보다 상단에 위치하게 된다면,
하위 클래스의 예외처리는 실행되지 않기 때문이다. (예외처리 코드가 순차적으로 실행되기 때문이다.)
이 부분을 유의하면서 예외처리를 하면 큰 문제가 없을 것이다.
※ ArrayIndexOutOfBoundsException
배열의 크기가 오버되어지면 발생하는 익셉션이다.
String[] subjectArr = {"자바", "오라클", "JSP"};
try {
for(int i=0; i<=subjectArr.length; i++) {
System.out.println(subjectArr[i]);
}
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println(">> 배열의 인덱스 범위가 초과되었습니다. <<");
// System.out.println(e.getMessage());
// e.getMessage() 는 오류메시지를 알려주는 것이다.
e.printStackTrace(); // 오류의 위치를 추적하여 알려준다.
}
※ ArithmeticExceptionException
분모에 0 이 들어가는 경우에 발생하는 익셉션
try {
int num =10;
for(int i=2; i>=0; i--) {
System.out.println(num/i);
}
} catch(ArithmeticException e) {
System.out.println(">> 분모에는 0 이 올 수 없습니다. <<");
// System.out.println(e.getMessage());
// e.getMessage() 는 오류메시지를 알려주는 것이다.
// e.printStackTrace(); // 오류의 위치를 추적하여 알려준다.
}
해당 코드를 실행하면 처음 i=2 가 for 문에 들어가 실행되고 5라는 값이 출력
이후 i=1 이 들어가고 10이 출력
다음엔 분모가 0이 되고 예외처리가 실행된다.
※ ArrayIndexOutOfBoundsException 과 ArithmeticException 을 같이 사용해보기
int[] numArr = {10,20,30};
for(int i=3; i>=0; i--) {
try {
int val = numArr[i]/i; // numArr[3]/3 , 30/2 , 20/1 , 10/0
System.out.println(val);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println(">> 배열의 인덱스 범위가 초과되었습니다. <<");
} catch(ArithmeticException e) {
System.out.println(">> 분모에는 0 이 올 수 없습니다. <<");
// i가 0이 되어지면 잡아준다.
}
}
※ e.getMessage()
에러 메시지를 출력할 수 있다.
for(int i=3; i>=0; i--) {
try {
int val = numArr[i]/i; // numArr[3]/3 , 30/2 , 20/1 , 10/0
System.out.println(val);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("에러메시지 : "+ e.getMessage());
} catch(ArithmeticException e) {
System.out.println("에러메시지 : "+ e.getMessage());
}
}
위의 코드는 더욱 간략하게 나타낼 수 있는데, 바로 예외처리를 동시에 해주는 방법이다.
for(int i=3; i>=0; i--) {
try {
int val = numArr[i]/i; // numArr[3]/3 , 30/2 , 20/1 , 10/0
System.out.println(val);
} catch(ArrayIndexOutOfBoundsException | ArithmeticException e) {
System.out.println("에러메시지 : "+ e.getMessage());
}
}
※ try ~ catch ~ finally
finally는 오류가 발생하든 안하든 무조건적으로 실행하게 해준다.
때문에 무조건 실행해야하는 코드는 finally 에 기술해주면 된다.
String[] str_Arr = {"10", "스물", "30"};
int count = 0;
for(int i=3; i>=0; i--) {
try {
int val = Integer.parseInt(str_Arr[i])/i; // str_Arr[3]/3 , 30/2 , Integer.parseInt(strArr["스물"])/1 , 10/0
System.out.println(val);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("배열의 인덱스 번호 "+ e.getMessage()+ "이 존재하지 않습니다.");
} catch(ArithmeticException e) {
System.out.println("분모에 0 을 넣을 수 없습니다.");
} catch(Exception e) {
System.out.println("에러메시지 : "+ e.getMessage());
} finally {
// finally 는 오류가 발생하든지 또는 오류가 발생하지 않든지 관계 없이 무조건 실행한다.
// 때문에 무조건 실행해야하는 것들은 finally에 기술해주면 된다.
System.out.println(++count + "번 반복함!!\n");
}
}
예외문은 정말 많이 쓰이는 문법이고, 수업시간에도 많이 써왔어서
크게 어려운 부분은 없었다.
예외처리를 정리하면서 느낀 점은
에러 발생으로인한 프로그램의 중단을 막는 역할도 중요하지만
개발자가 의도적으로 다양한 상황에서 사용할 줄 알아야 예외처리의 진가가 나타나지 않을까...
'개념정리 > JAVA' 카테고리의 다른 글
[JAVA] Day-17 _ 예외 던지기 (Exception Throws) (0) | 2023.02.07 |
---|---|
[JAVA] Day-17 _ 사용자 정의 예외처리 (User Define Exception) (0) | 2023.02.06 |
[JAVA] Day-16 _ 인터페이스 (interface) (0) | 2023.02.06 |
[JAVA] Day-16 _ final 키워드 (0) | 2023.02.06 |
[JAVA] Day-16 _ 접근 제어자 (access modifier) (0) | 2023.02.06 |