본문 바로가기
BACK-END/JAVA

[자바 프로그래밍 기초] 예외(Exception)와 예외처리 (try- catch)

by codechu 2025. 4. 17.

예외란 ?

 

프로그램 실행 중 예상하지 못한 상황이 빌생하는 것을 의미함.

의도적으로 예외를 발생시킬 땐 throw키워드를 통해 발생시킴.

 

※예외를 처리하지 않으면 프로그램이 중단될 수도. -> 그래서 예외처리(try-catch)를 통해 프로그램을 실행.

 

 

의도적인 예외란 ? 특정도전에서 의도적으로 예외를 발생시킬 수 있음.

ex) 나이가 18살 이하일 경우 예외발생

더보기

public class Main {
    public static void main(String[] args) {
        int age = 10;
        if (age < 18) {
        // ✅ 의도적으로 예외를 발생시키는 부분
            throw new IllegalArgumentException("미성년자는 접근할 수 없습니다!");
        }
        System.out.println("....");
    }
}

throw를 통해 특정상황(age<18)에서 예외를 정의하고 제어할 수 있음 이렇게 예외가 발생하면 예외 밑에 

   " System.out.println("...."); " 출력 부분은 실행되지 않음.

 

 

그러면 이 예외를 고쳐줘야 하는데 (예외구조와 종류)

 

  • RuntimeException - UncheckedException  :  RuntimeException을 상속받는 모든 예외를 UncheckedException라고 한다. 예외처리를 컴파일러가 체크 해주지않음(unchecked)

 

  • Exception - CheckedException :  Exception 클래스를 직접 상속받는 모든 예외를 CheckedException 이라고 한다.  예외처리를 컴파일러가 체크 해줌.(checked)

자바의 예외 종류

 

 

 

예외전파

  • 메서드에서 발생한 예외가 해당 메서드 내에서 처리되지 않았을 때 매서드를 호출한 상위 메서드로 전달되는 과정.
  • 예외가 프로그램 시작 지점(main)까지 전파되고 끝내 처리되지 않으면 프로그램이 비정상 종료됨.

 

 

 

 

RuntimeException = UncheckedException 처리방법

더보기

public class ExceptionPractice {
    public void callUncheckedException() {
        if (true) {
            System.out.println("언체크 예외 발생");
            throw new RuntimeException(); // ✅ 예외발생 
        } // 무조건 예외가 발생하는 로직 이대로 두면 이 메서드( callUncheckedException())를 호출한 다른 클래스에도 영향을 미침 
    }
}

 

메서드 클래스 내에서 처리한다면  ↓

더보기

public class ExceptionPractice {
    public void callUncheckedException() {

 try{  if (true) {
            System.out.println("언체크 예외 발생");
            throw new RuntimeException(); // ✅ 예외발생 
        }  catch( RuntimeException e) {

         System.out.println("언체크 예외 처리");
    }

 }
}

메서드를 호출한 클래스에서 처리하기 ↓

더보기

public class Main {
    public static void main(String[] args) {
        // 예외 실습 객체 인스턴스화
        ExceptionPractice exceptionPractice = new ExceptionPractice();

        // ✅ 언체크 예외 호출
        exceptionPractice.callUncheckedException();
        
        // ❌ 예외처리를 해주지 않았기 때문에 프로그램이 종료됩니다.
        System.out.println("이 줄은 실행되지 않습니다."); 
    }
}

더보기

public class Main {

    public static void main(String[] args) {
        ExceptionPractice exceptionPractice = new ExceptionPractice();

        // ✅ 상위로 전파된 예외처리
        try {
            exceptionPractice.callUncheckedException();

        } catch (RuntimeException e) { // ✅ 예외처리
            System.out.println("언체크 예외 처리");   

        } catch (Exception e) {
            System.out.println("체크 예외 처리");
        } //catch는 여러개 넣을 수 있음

        System.out.println("프로그램 종료");
    }
}

try안에 예외가 발생할 수 있는 로직을 넣어주고 

catch안에 처리하고싶은 에러를 매개변수로 넣고 출력.

cathc는 여러개 나올 수 있음.

 

 

Exception = checkedException

 

메서드를 작성한 클래스 안에서 처리방법 ↓

더보기

public class ExceptionPractice {

    public void callCheckedException() {
    // ✅ try-catch 로 예외 처리
        try { 
            if (true) {
                System.out.println("체크예외 발생");
                throw new Exception();
            }
        } catch (Exception e) {
            System.out.println("예외 처리");
        }
    }
}

 

 

하지만 클래스 내에서가 아니라 호출한 클래스에서 예외를 처리하고 싶을때 ?

 

checkedException 오류는 컴파일에서 오류를 확인하기 때문에 다음으로 넘어갈 수가 없음 그럴 때 쓰는게 

throw

throws 키워드를 사용해 예외를  호출한 곳에서 처리하도록 강제하는 방식 (책임 전가)

 

-> 꼭 다른 클래스에서  호출할때 throws를 쓰는 줄 알았지만 그건 아님, 같은클래스에서도 메소드를 선언한는 곳에서 해결을 안하면 (같은 클래스 안에서 )메소드 호출하는 곳으로 책임전가 가능.

 

더보기

public class ExceptionPractice {

    public void callCheckedException() throws Exception { // ✅ throws 예외를 상위로 전파
        if (true) {
            System.out.println("체크예외 발생");
            throw new Exception();
        }
    }
}

 

 

더보기

package chapter3.exception;

public class Main {
    public static void main(String[] args) {

        // 예외 실습 객체 인스턴스화
        ExceptionPractice exceptionPractice = new ExceptionPractice();

        // 체크 예외 사용
        // ✅ 반드시 상위 메서드에서 try-catch 를 활용해 주어야합니다.
        try {
            exceptionPractice.callCheckedException();
        } catch (Exception e) {
            System.out.println("예외처리");
        }
    }
}

 

'BACK-END > JAVA' 카테고리의 다른 글

JAVA | 20251118 연산자  (0) 2025.11.19
JAVA | 20251117  (0) 2025.11.17
[자바] 계산기 과제 TIL  (0) 2025.04.23
[자바 프로그래밍 기초] scanner 메소드 next(), nextLine()  (0) 2025.04.16
1. Java란 ?  (0) 2025.03.27