본문 바로가기
Java

[Java] 예외 처리

by lmyourpearl 2025. 11. 15.

예외 처리 코드

 

try-catch-finally 블록

생성자 내부와 메소드 내부에서 작성되어 일반 예외와 실행 예외가 발생할 경우 예외 처리를 할 수 있도록 해줌.

// 일반 예외 처리

package sec02.exam01;

public class TryCatchFinallyExample {
	public static void main(String[] args) {
    	try {
          Class clazz = Class.forName("java.lang.String2");
       } catch(ClassNotFoundException e) {
       	 System.out.println("클래스가 존재하지 않습니다.");
       }
   }
}

1.  try 블록에는 예외 발생 가능 코드가 위치함.

2.  try 블록의 코드가 예외 발생 없이 정상 실행되면 catch 블록의 코드는 실행되지 않고 finally 블록의 코드를 실행함.

     만약 try 블록의 코드에서 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드를 실행하고 finally 블록의 코       드를 실행함.

3.  finally 블록은 생략 가능하며, 예외 발생 여부와 상관없이 항상 실행할 내용이 있을 경우에만 finally 블록을 작성하면 됨.

     심지어 try 블록과 catch 블록에서 return문을 사용하더라도 finally 블록은 항상 실행됨.

// 실행 예외 처리

package sec02.exam02;

public class TryCatchFinallyRuntimeExceptionExample {
	public static void main(String[] args) {
    	String data1 = null;
        String data2 = null;
        try {
          data1 = args[0];
          data2 = args[1];
      } catch(ArrayIndexOutOfBoundsException e) {
        System.out.println("실행 매개값의 수가 부족합니다.");
        return;
      }
      
      try {
        int value1 = Integer.parseInt(data1);
        int value2 = Integer.parseInt(data2);
        int result = value1 + value2;
        System.out.println(data1 + "+" + data2 + "=" + result);
      } catch(NumberFormatException e) {
      	System.out.println("숫자로 변환할 수 없습니다.");
      } finally {
      	System.out.println("다시 실행하세요.");
      }
   }
}

다중 catch

catch 블록의 예외 클래스 타입은 try 블록에서 발생된 예외의 종류를 말하는데, try 블록에서 해당 타입의 예외가 발생하면 catch 블록을 실행하도록 되어 있음. catch 블록이 여러 개라 할지라도 단 하나의 catch 블록만 실행되는데, try 블록에서 동시 다발적으로 예외가 발생하지 않고, 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch블록으로 이동하기 때문.

// 다중 catch

package sec02.exam03;

public class CatchByExceptionKindExample {
	public static void main(String[] args) {
    	try {
          String data1 = args[0];
          String data2 = args[1];
          int value1 = Integer.parseInt(data1);
          int value2 = Integer.parseInt(data2);
          int result = value1 + value2;
          System.out.println(data1 + "+" + data2 + "=" + result);
        } catch(ArrayIndexOutOfBoundsException e) {
          System.out.println("실행 매개값의 수가 부족합니다.");
        } catch(NumberFormatException e) {
          System.out.println("숫자로 변환할 수 없습니다.");
        } finally {
          System.out.println("다시 실행하세요.");
        }
    }
 }
 
 // 실행 결과
 // 실행 매개값의 수가 부족합니다.

* 다중 catch 블록 주의점: 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 함


예외 떠넘기기(throws)

메소드 내부에서 예외가 발생할 수 있는 코드를 작성할 때 try-catch 블록으로 예외를 처리하는 것이 기본이지만, 경우에 따라서는 메소드를 호출한 곳으로 예외를 떠넘길 수 있는데, throws 키워드를 메소드 선언부 끝에 작성하여 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 함.

리턴타입 메소드이름(매개변수,...) throws 예외클래스1, 예외클래스2,... { }

리턴타입 메소드이름(매개변수,...) throws Exception { }

 

// 예외 처리 떠넘기기

package sec02.exam05;

public class ThrowsExample {
	public static void main(String[] args) {
    	try {
          findClass();
      } catch(ClassNotFoundException e) {
      	System.out.println("클래스가 존재하지 않습니다.");
      }
   }
   
   public static void findClass() throws ClassNotFoundException {
   	  Class clazz = Class.forName("java.lang.String2");
   }
}

main( ) 메소드에서도 throws 키워드를 사용해서 예외를 떠넘길 수 있는데, 결국 JVM이 최종적으로 예외를 처리하게 됨. JVM은 예외의 내용을 콘솔에 출력하는 것으로 예외 처리를 함.

 

public static void main(String[] args) throws ClassNotFoundException {
	findClass();
}

* main( )메소드에서 throws Exception을 붙이는 것은 좋지 못한 방법으로, main( )에서 try-catch블록으로 예외를 최종 처리하는것이 좋음.

'Java' 카테고리의 다른 글

[JSP] 내장 객체_1  (0) 2025.12.03
[Java] 예외 클래스  (0) 2025.11.15
[Java] 익명 객체  (0) 2025.11.15
[Java] 중첩 클래스와 중첩 인터페이스  (0) 2025.11.15
[Java] 타입 변환과 다형성  (0) 2025.11.14