티스토리 뷰

JAVA/java 기초

JAVA예외처리(Exception)

svdjcuwg4638 2023. 4. 14. 18:47

예외처리란?

 

예외 처리는 프로그램 실행 중에 발생할 수 있는 예상되거나 예상치 못한 오류를 처리하고, 프로그램이 적절하게 실행되도록 하는 방법입니다. 자바에서는 try-catch-finally 블록과 throw 키워드를 사용하여 예외 처리를 수행합니다.

 


자바에서 예외(Exception)는 두 가지 유형으로 나뉩니다:

 

  1. Checked Exception: 컴파일 시점에 확인되는 예외로, 이러한 예외는 반드시 try-catch 블록을 사용하거나 메서드에 throws 키워드를 사용하여 처리해야 합니다. 예를 들어, FileNotFoundException, SQLException 등이 있습니다.

  2. Unchecked Exception: 런타임 시점에 발생하는 예외로, 컴파일러가 강제로 처리를 요구하지 않습니다. 하지만 이러한 예외도 적절한 처리를 하여 프로그램이 예상치 못한 동작을 수행하는 것을 방지해야 합니다. 예를 들어, NullPointerException, ArrayIndexOutOfBoundsException, ArithmeticException 등이 있습니다.

 

예외 종류 ( 흔히보이는  7가지

 

1. NullPointerException

객체 참조가 null인 경우, 해당 객체의 메소드를 호출하거나 멤버 변수에 접근하려고 할 때 발생합니다. 객체를 초기화하지 않거나 객체가 더 이상 사용되지 않아 메모리에서 해제된 경우에 발생할 수 있습니다.

Object obj = null;
obj.toString(); // NullPointerException 발생

 

2. ArrayIndexOutOfBoundsException

배열의 인덱스 범위를 초과하여 접근하려고 할 때 발생합니다. 배열의 길이를 초과하는 인덱스에 접근하거나 음수 인덱스를 사용하는 경우에 발생할 수 있습니다.

int[] arr = new int[5];
arr[5] = 10; // ArrayIndexOutOfBoundsException 발생 (인덱스 범위: 0 ~ 4)

 

3. ClassCastException

잘못된 타입으로 객체를 캐스팅하려고 할 때 발생합니다. 클래스 간의 상속 관계가 없는 경우나, 인터페이스를 구현하지 않은 클래스로 캐스팅하려는 경우에 발생할 수 있습니다.

Object obj = new String("Hello");
Integer num = (Integer) obj; // ClassCastException 발생

 

 

4.FileNotFoundException

파일을 찾을 수 없거나, 접근 권한이 없는 경우에 발생합니다. 존재하지 않는 파일 경로를 사용하거나, 파일이 이미 사용 중인 경우에 발생할 수 있습니다.

File file = new File("non_existent_file.txt");
FileReader fr = new FileReader(file); // FileNotFoundException 발생

 

5.ArithmeticException

산술 연산에서 발생하는 예외로, 대표적으로 0으로 나누는 경우에 발생합니다.

int result = 10 / 0; // ArithmeticException 발생 (0으로 나누기)

 

 

6.IOException

입출력 작업 중 발생하는 예외로, 파일 읽기/쓰기, 네트워크 연결 등에서 발생할 수 있습니다. 디스크 공간이 부족하거나, 네트워크 연결이 끊어진 경우에 발생할 수 있습니다.

FileInputStream fis = null;
try {
    fis = new FileInputStream("input.txt");
    // ... 파일 읽기 작업
} catch (IOException e) {
    // IOException 처리
}

 

예외 처리를 위한 구문은 다음과 같습니다:

 

  • try-catch-finally 블록: 예외가 발생할 가능성이 있는 코드를 try 블록에 배치하고, catch 블록에서 발생한 예외를 처리합니다. finally 블록은 선택 사항으로, 예외 발생 여부와 관계없이 항상 실행되는 코드를 포함합니다.
try {
    // 예외가 발생할 가능성이 있는 코드
} catch (ExceptionType1 e) {
    // 예외 처리 코드
} catch (ExceptionType2 e) {
    // 다른 예외 처리 코드
} finally {
    // 예외 발생 여부와 관계없이 항상 실행되는 코드
}

 

  • throw 키워드: 메서드에서 발생한 예외를 호출한 곳으로 전달할 때 사용합니다. throw 키워드를 사용하여 예외를 명시적으로 발생시킬 수도 있습니다.
public void someMethod() throws SomeException {
    // ...
    if (someCondition) {
        throw new SomeException("An error occurred");
    }
    // ...
}

 

예외 처리를 통해 프로그램 실행 중 발생할 수 있는 오류를 관리하고, 프로그램이 안정적으로 실행될 수 있도록 할 수 있습니다. 이를 통해 사용자에게 적절한 오류 메시지를 제공하거나, 오류가 발생한 경우 복구 작업을 수행할 수 있습니다.

 

예시코드

1. 예외클래스를 만들어 Exception을 상속받아 예외처리

2. 이미 있는 예외를 이용하여 예외처리하기

 

1~100사이의 숫자가 아니라면 에러를 발생시키는 코드

 

import java.util.InputMismatchException;
import java.util.Scanner;

// 사용자 정의 예외 클래스
class InvalidNumberException extends Exception {
	// 예외가 생성될때 설정한 예외 문구를 출력하기위해 super에 msg전달
    public InvalidNumberException(String message) {
        super(message);
        // Exception클래스의 getMessage()함수에 message설정
    }
}

public class NumberValidator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("1~100 사이의 숫자를 입력하세요: ");

        try {
            int number = scanner.nextInt();
            
            validateNumber(number);
            // 입력받은 값이 적합하지않다면 오류발생
            // 정상이라면 밑의 코드진행 catch는 오류가 발생했을때만
            
            System.out.println("올바른 숫자입니다.");
            //오류발생시 위 출력문은 실행되지 않음
            
         // 원래 있는 예외처리를 이용   
        } catch (InputMismatchException e) {
            System.out.println("에러: 숫자가 아닌 문자가 입력되었습니다.");
         
         // 직접 만든 예외처리
        } catch (InvalidNumberException e) {
            System.out.println("에러: " + e.getMessage());
            // exception에서 상속받았기때문에 getMessage()함수를 호출함으로서 무슨 에러인지 출력가능
            
        // finally는 성공하든 실패하든 무조건 실행된다.
        } finally {
            System.out.println("입력이 완료되었습니다.");
        }
    }

    public static void validateNumber(int number) throws InvalidNumberException {
    	// 입력된값이 1보다 작거나 100보다 크면 if문 실행
        if (number < 1 || number > 100) {
            throw new InvalidNumberException("입력된 숫자가 1~100 사이의 숫자가 아닙니다.");
            // 만든 예외 클래스에 생성자가 생성되고 오류문구가 매개변수로 들어가게된다.
        }
    }
}

 

'JAVA > java 기초' 카테고리의 다른 글

쓰래드(Thread) 와 러너블(runnarble) 정리  (0) 2023.04.14
JAVA 싱글톤이란?(Singleton)  (0) 2023.04.14
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
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
글 보관함