기억의 DataBase

예외처리(Exception) 본문

Java

예외처리(Exception)

Zester; 2019. 1. 17. 12:34
  • 예외처리(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