developer Studying/Java

[Java]try catch문 이해하기 -예외처리

ParkYeseul 2024. 9. 22. 12:44

나는 요즘 try catch문을 매 시간 만난다.

사실 선생님께서 try catch문을 설명하실 때 제대로 안들었다.

일단 이해가 안가기도 했고 그 당시에 시험 준비하느라 정신이 수업보다는 다른 곳에 

있어서 이해를 잘 못하고 넘어갔었고 이게 이렇게 중요한 코드일거라고 생각을 전-혀 못했다.

한 달? 갓 넘은 시점이었던 것 같은데,, 나 자신 반성해.

 

지금이라도 이렇게 정리를 해서 완벽하게 뽀개고 넘어가려고 한닷

 

 

 


🔆예외처리

프로그램 실행 시 발생할 수 있는 예기치 못한 예외 발생에 대비한 코드를 작성하는 것

실행 중인 프로그램의 갑작스런 비정상적인 동작을 막고, 에러를 잡아 복구를 시도하거나

회피 하는 식으로 처리를 해서 프로그램을 정상적으로 실행 할 수 있도록 하는 것이다.

 

 

 

🔋try catch문법

try {
    // 예외가 발생할 가능성이 있는 코드
} catch (예외타입 변수명) {
    // 예외 발생 시 실행되는 코드
} finally {
    // 항상 실행되는 코드 (선택적)
}

 

  • try 블록: 여기에는 예외가 발생할 가능성이 있는 코드 작성
    예외가 발생하지 않으면 catch 블록은 실행되지 않고, try 블록의 코드가 정상적으로 수행

  • catch 블록: try 블록에서 발생한 예외를 처리하는 코드를 작성 (예외의 유형에 따라 여러 개의 catch 블록 사용 가능)
    구체적인 예외부터, 상위 예외 순으로 작성
  • finally 블록 (선택적): try-catch 블록이 끝난 후 항상 실행되는 코드로 자원 정리와 같은 작업에 사용
    (생략할 시 자원 누수의 문제가 있어, 작성하는 것이 좋다!)

 

🔑예제

public class ExceptionExample {
    public static void main(String[] args) {
        try {
            int[] numbers = {1, 2, 3};
            System.out.println(numbers[3]); // ArrayIndexOutOfBoundsException 발생
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("예외 발생: 배열의 범위를 초과했습니다.");
        } finally {
            System.out.println("이 메시지는 항상 출력됩니다.");
        }
    }
}

 

  • try 블록: numbers[3]에 접근하려고 할 때, 배열의 인덱스 범위를 초과하여
                   ArrayIndexOutOfBoundsException이 발생
  • catch 블록: 예외가 발생하면 이 블록이 실행되어 예외 메시지 출력
  • finally 블록: 예외 발생 여부와 상관없이 항상 실행

 

🔑예제2

import java.util.Scanner;

public class DivisionExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        try {
            System.out.print("첫 번째 숫자를 입력하세요: ");
            int num1 = scanner.nextInt();
            System.out.print("두 번째 숫자를 입력하세요: ");
            int num2 = scanner.nextInt();

            int result = num1 / num2; // 0으로 나누기 시도
            System.out.println("결과: " + result);
        } catch (ArithmeticException e) {
            System.out.println("예외 발생: 0으로 나눌 수 없습니다.");
        } catch (Exception e) {
            System.out.println("예외 발생: " + e.getMessage());
        } finally {
            scanner.close();
            System.out.println("스캐너가 닫혔습니다.");
        }
    }
}

 

  • try 블록: 두 숫자를 입력받고 나누기 실행
  • catch 블록: ArithmeticException: 0으로 나눌 경우 발생
                        일반적인 Exception: 다른 예외를 처리합니다.
  • finally 블록: 스캐너를 닫아 자원을 정리

 

🛍️e.printStackTrace()

정말 많이 쓰는 메서드라 정리를 해보겠습니다!
이 메서드는 예외 처리 시 발생한 예외 정보를 출력

예외가 발생한 원인과 예외가 발생한 위치를 상세하게 보여줌

즉 예외가 발생한 메서드와 해당 메서드를 호출한 상위메서드들이 어떤 흐름으로 연결되어 있는지 보여줌

어디서 예외가 발생했는지! 원인이 무엇인지 파악 가능!!

 

public class ExceptionExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // ArithmeticException 발생
        } catch (ArithmeticException e) {
            e.printStackTrace();  // 호출 스택을 출력
        }
    }
}

//출력결과
java.lang.ArithmeticException: / by zero
    at ExceptionExample.main(ExceptionExample.java:5)

 

 



printStackTrace()의 유용성:

  • 예외 발생 위치를 정확히 알려주기 때문에, 디버깅이나 오류 추적에 큰 도움
  • 예외 처리 도중 예외의 원인과 전체 흐름을 빠르게 파악 가능
  • 예외가 어디에서 발생했는지와 어떤 메서드들이 호출되었는지를 확인할 수 있어, 코드 수정 시 매우 유용

printStackTrace()와 e.getMessage()의 차이:

  • e.getMessage()는 예외의 간단한 설명(에러 메시지)만 출력
  • e.printStackTrace()는 예외가 발생한 경로메서드 호출 흐름을 포함한
    전체 스택 추적 정보를 출력

 

 


🔎혼잣말

아하..왜 오류에

at ExceptionExample.main(ExceptionExample.java:5)이런식으로 뜨는지 이제 이해했다.

ㅋㅋㅋㅋ..예슬아!!!!좀 예민해지자! 무던해지지말자 모든지 궁금해해야겠다.

 

'developer Studying > Java' 카테고리의 다른 글

[Java]JDBC와 DAO, DTO 코드 흐름 읽어보기  (0) 2024.09.22