일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 즐거운자바
- JavaScript
- EDWITH
- spring
- nth-child()
- optgroup
- 부정 선택자
- nth-of-type()
- 가상클래스 선택자
- 속성 선택자
- 가상요소 선택자
- 다시볼 것
- 깃헙
- 소스트리
- 다시보자
- 복합 선택자
- 상속
- vmax
- ES6
- jsp
- 웹개발
- vmin
- 서블릿
- datalist
- HTML Templating
- 자바
- 부스트코스
- 즐거운 자바
- 김성박
- 보충필요
Archives
- Today
- Total
기억의 DataBase
예외처리(Exception) 본문
-
예외처리(Exception)
JVM에는 java stack과 heap이라는 메모리 영역이 있는데
인스턴스를 만들면 heap이라는 영역의 메모리에 올라감
메소드가 실행되면 실행되는 메소드 정보가 stack entry라고 불리는 공간에 저장되고(실행 후 삭제됨)
그 stack entry(메소드명 / 라인수 / 변수정보)는 java stack에 한건 저장됨
에러가 발생하면 메소드명과 라인위치 정보(stack Trace)를 제공하고, 에러처리하고 프로그램이 종료됨
컴파일은 문제가 없으나, 실행시에 오류가 발생함
-
Exception의 종류
1.Runtime Exception - RuntimeException을 상속받고 있음
(Exception처리를 하지 않아도 컴파일은 됨)
보편적으로 사용
2.Checked Exception - RuntimeException을 상속받지 않고, Exception을 상속받은 클래스
(Exception처리를 하지 않으면, 컴파일 오류가 발생)
try-catch가 많아져야 하므로 코드가 지저분해짐(정말 중요한 경우에 사용)
※ 올바르지 않은 결과를 출력한다면, 아예 실행되지 않도록 하는 것이 좋음
※ 먼저 파라미터를 검사하는 습관을 들이면,
아래에 복잡한 로직을 실행하다가 중간에 에러가 발생하는 낭비를 막음
아래에 복잡한 로직을 실행하다가 중간에 에러가 발생하는 낭비를 막음
※ Resource 낭비를 막기위해 Finally를 사용하는 경우가 있음(오류가 발생한다고 해도) - DB 연결
◎Code
public class CalBean {
public static void main(String[] args) {
int a = 6;
int b = 0; // 나누는 수가 0이 되면 에러발생
try {
int c = Cal.divide(a,b); // 내부적으로 발생하는 예외 : ArithmeticException
System.out.println(c);
// 이렇게 출력이 되는 것은 위험,
원래는 무한대가 나와야하므로 차라리 종료되는 것이 낫다
}catch(ParameterException ex) {
System.out.println("0으로 나눌 수 없어서 사용하는 곳에서 예외처리 - 에러 메시지는 안나옴");
}finally {
System.out.println("오류가 발생했든 안했든 무조건 실행 - finally");
}
}
}
class Cal {
/** 메소드 설명을 쓸 수 있는 주석 기능( '/**+enter' )
* 파라미터 m을 n으로 나눈 결과를 리턴한다
* @param m
* @param n
* @return m/n
*
*/
public static int divide(int m, int n) throws ParameterException {
// 이 메소드는 에러가 발생할 수 있다는 알림(없어도 실행에는 문제없음)
int c = 0;
if(n==0) { // 방어적 프로그래밍으로 나누기 전에 파라미터를 검사하여,메소드를 사용하는 측에 에러 던짐
throw new ParameterException("0으로 나눌 수 없음 - 에러 메시지 발생");
}
try {
c = m / n; // 에러가 발생해서 바로 catch로 내려감, 원래 무한대가 나오는게 맞음
System.out.println("이 출력은 실행 안됨");
}catch (Exception ex){
System.out.println("0으로 나눌 수 없습니다");
}
return c;
}
}
// 사용자 정의 예외 - 파악이 가능한 이름이 중요
class ParameterException extends RuntimeException{ // 그냥 Exception으로 상속 받으면 Checked Error가 남
>> 아예 컴파일 에러가 남
>> 아예 컴파일 에러가 남
public ParameterException(String msg) {
super(msg);
}
public ParameterException(Exception ex) {
super(ex);
}
}
'Java' 카테고리의 다른 글
접근지정자 (0) | 2019.01.17 |
---|---|
생성자 (0) | 2019.01.17 |
객체지향 (0) | 2019.01.16 |
package(디렉토리)와 중요 package (0) | 2019.01.14 |
OOP(Object Oriented Programming) - 객체지향과 Memory (0) | 2019.01.14 |
Comments