Java 강의 - 예외 (Exception) 처리하기 [ 즐거운 자바 강좌 ]

·2023년 8월 9일

java 공부

목록 보기
10/13
post-thumbnail

Error와 Exception

  • 비정상적으로 프로그램을 종료되게 하는 원인

🏁 Error
종류

  • 컴파일 에러 : 컴파일시 발생하는 에러
  • 런타임 에러 : 실행시 발생하는 에러
    • 컴파일 타임과 런타임 타임 차이
      : 컴파일이란 소스코드가 기계어로 변환되는 과정이다.
      런타임이란 컴파일 이후 프로그램이 동작되어지는 때다.(+ 컴파일 중에 감지 못한 에러들이 뜬다)

자바에서는 실행시 2가지 형태의 오류가 발생할 수 있다.

  • Error : 수습할 수 없는 심각한 오류
  • Exception (예외) : 예외 처리를 통해 수습할 수 있는 덜 심각한 오류
  • 메모리 부족, 스택오버플로우등이 발생하여 프로그램이 죽는 것은 프로그래머가 제어할 수 없다.

🏁 예외 처리하기

try{
	코드1
    코드2
    ....
}catch(Exception클래스명1 변수명1){
	Exception을 처리하는 코드
}

< 실제 적용 코드 / 이 코드에서 예외는 10을 0으로 나눌 때 발생한다 >

public class Exception1 {
    public static void main(String[] args) {
        ExceptionObj1 exobj = new ExceptionObj1();
        int value = exobj.divide(10, 0); // 예외 발생 0으로 나눌 수 없다.
        System.out.println("value = " + value);

    }
}

class ExceptionObj1{
    public int divide(int i, int k){
        int value = 0;
        try {
            value = i / k;// Exception 발생 -> try catch 문으로 예외 처리하기
        }catch(ArithmeticException ex){ // 예외 발생하면  JVM이 예외 인스턴스를 발생하기 때문에
            System.out.println("0으로 나눌 수 없어요");// 해당 예외 인스턴스 객체를 catch로 받는다.
            System.out.println(ex.toString());
        }
        return value;
    }
}

🏁 예외 떠넘기기(throws)

리턴타임 메소드명 ( 아규먼트 리스트 ) throws Exception클래스명1 {
	코드1
}

< 적용 코드 >

public class Exception1 {
    public static void main(String[] args) {
        ExceptionObj1 exobj = new ExceptionObj1();
        try {
            int value = exobj.divide(10, 0); // 예외 발생 0으로 나눌 수 없다.
            System.out.println(value);
        }catch(ArithmeticException ex){
            System.out.println(" 0으로 나눌 수 없습니다 ");
    }
}

class ExceptionObj1{
    // divide를 호출한 곳에 예외 처리를 떠넘긴다.
    public int divide(int i, int k) throws ArithmeticException{
        int value = 0;
        value = i / k;
        return value;
    }
}

RuntimeException과 Checked Exception

🏁 RuntimeException

-> RuntimeException을 상속하고 있는 exception은 다 RuntimeException
  • 실행시에 오류가 난다.

🏁 Exception

-> RuntimeException을 상속받지 않고 있는 exception
  • 예외처리를 해주지 않으면 컴파일시에 오류가 난다.

Exception을 만들 때는 RuntimeException을 상속받아 만드는 것이 좋다.

다중 Exception 처리

public static void main(String[] args) {
        // {4,2}로 바꿔서 실행해보고, int[] array = null로도 바꿔본다.
        int[] array ={4,0};
        int[] value = null;
        try{
            value[0]=array[0]/array[1];
        }catch(ArrayIndexOutOfBoundsException aiob){
            System.out.println(aiob.toString());
        }catch(ArithmeticException ae){// 위의 두개는 왜 Exception으로 한번에 안했어??
            System.out.println(ae.toString());// 개발자(나)가 위의 두개는 오류를 특별히 해결해주고 싶어서
        }catch(Exception ex){
            System.out.println(ex);// nullExcpetion은 Exception 상속 받아서 이렇게 써도 됨
        }
    }

사용자 정의 Exception

-> RuntimeException을 상속받아 만든다.

사용자가 이용할 때 더 편리하다.

profile
기회를 잡기 위해 준비하자 !

0개의 댓글