멍발자의 개발

예외 처리 본문

STUDY/Java

예외 처리

개발하는 멍발자 2022. 3. 29. 17:16

예외 (Exception)

 

프로그램 실행할 때 예기치 못한 오류가 발생할 때를 말한다. 

 

  • 배열의 요소수보다 큰 요소수를 지정해 액세스를 실시한 경우
  • 사용자가 입력 실수를 하였을 때
  • 존재하지 않는 파일을 읽고 지정하였을 때
  • 데이터베이스에 연결할 수 없을 때
  • 할당되지 않은 저장 영역에 액세스한 경우
  • 정수를 0으로 나누었을 때

예외를 처리하는 방법 (try - catch)

 

try { 실행내용 ...

    } catch (예외처리문) {

     예외 처리 내용

    }

 

오류가 발생할 것 같으면 항상 try catch문을 사용하자.

 

 

<배열의 요소수보다 큰 요소수를 지정해 액세스를 실시한 경우>

public class ArrayException2 {

    public static void main(String[] args) {
        try {
            //int 배열
            int[] intArray = new int[5];

            // 10 인덱스에 값을 대입
            System.out.println("intArray[10]에 숫자를 할당합니다.");
            intArray[10] = 50; // 최대 배열 요소수를 초과하는 대입처리

            // 결과표시
            System.out.println("intArray[10]에 50을 할당하였습니다.");
        } catch (ArrayIndexOutOfBoundsException e) {// 최대 배열 소소수 초과 예외처리
            System.out.println("배열의 요소수를 초과했습니다.");
        }
        System.out.println("프로그램 종료");
    }
}

//결과 

intArray[10]에 숫자를 할당합니다.
배열의 요소수를 초과했습니다.
프로그램 종료

 

<정수를 0으로 나누었을 때>

public class ZeroException2 {
    public static void main(String[] args) {
        try {
            // 숫자를 0으로 나눔
            int num = 10 / 0;

            // 결과
            System.out.println("10/0 결과: " + num);
        } catch (ArithmeticException e) { // 0 나누기의 예외처리
            System.out.println("0으로 나눌 수 없습니다.");
        }
        System.out.println("처리 종료");
    }
}
// 결과
0으로 나눌 수 없습니다.
처리 종료

<예외처리를 하지 않는 프로그램의 흐름>

main 메소드에서 오류에 대한 예외처리가 발견 안 됨 > 호출원으로 돌아가 대응하는 예외처리를 찾음 > 호출원 없음 > 중간종료

 

예외를 처리하는 방법 (try - catch) finally

 

finally 블록은 catch 문 다음에 설명한다.

finally 블록은 중요하게 체크할 수 있는 부분을 체크하고 넘어갈 수 있다.

예외 유무에 관계 없이 반드시 처리를 해 준다.

 

public class FinallyBlock {
    public static void main(String[] args) {
        try {
            // int형 배열
            int[] intArray = new int[5];

            // 배열에 값을 할당
            System.out.println("배열에 숫자를 할당합니다.");
            intArray[10] = 50; // 예외를 일부러 발생시키는 대입
            // intArray[0] = 50; // 올바르게 할당

            // 결과 표시
            System.out.println("배열에 50을 할당했습니다.");
        } catch (ArrayIndexOutOfBoundsException e) { //최대 배열 요소수를 초과하는 예외 처리

            System.out.println("배열의 요소수를 초과했습니다.");
        } finally {
            System.out.println("예외처리의 마지막 처리입니다."); //finally 블록
        }
        System.out.println("처리 종료");
    }
}

//결과
배열에 숫자를 할당합니다.
배열의 요소수를 초과했습니다.
예외처리의 마지막 처리입니다.
처리 종료

 

예외 처리를 실시한 경우와 실시 안 한 경우의 비교

 

프로그램의 이상 종료를 방지할 수 있다.

한 곳의 예외에 대한 처리를 정리하는 것이 가능해진다.

 

예외 처리의 기본 (try catch finally)

 

예외를 throw 한다. = 프로그램 실행 중에 에러가 발생했다.

 

예외를 catch 하다. = 예외를 잡다.

예외가 발생할 것으로 발생되는 처리 블록을 try {}으로 묶는다.

catch문은 복수 기술할 수가 있으므로 인수에 예외를 지정할 수 있다.

finally 블록은 반드시 실행된다. 생략도 가능하며 파일의 close 처리나 DB로부터의 절단 처리등을 기술한다.

try, catch 블록에 return statement가 기술되고 있어도 finally 블록은 실행된다.

 

비체크 예외: 예외 처리를 기술하지 않아도 컴파이라 할 수 있는 예외의 것 = 별로 추천하진 않는다.

 

<비체크 예외 종류>

  • ArithmeticException
  • NullPointerException
  • ArrayIndexOutOfBoundsException
  • IndexOutOfBoundsException
  • ArrayStoreException
  • ClassCastException
  • NoSuchFieldException
  • NoSuchMethodException
  • RuntimeException
  • IllegalAccessException
  • NumberFormatException

체크 예외: 예외 처리를 기술하지 않으면 컴파일 에러가 되는 예외 = 반드시 실행해야 한다.

<체크 예외 종류>

  • IOExceptiuon
  • ClassNotFoundException
  • FileNotFoundException

예외 클래스의 상하관계

 

상위 클래스에 예외 처리를 지정하면 거기에 포함되는 서브 클래스의 예외를 모두 catch 해 준다.

 

 

 

오류(Error)

 

오류는 "하드웨어 고장", "메모리 부족" 등이 있다.

 

 

'STUDY > Java' 카테고리의 다른 글

제네릭  (0) 2022.04.06
클래스 라이브러리  (0) 2022.04.01
Package & import  (0) 2022.03.28
생성자  (0) 2022.03.23
액세스와 캡슐화  (0) 2022.03.23
Comments