예외(Exception)는 프로그램 실행 중 발생할 수 있는 다양한 오류를 의미하며, 이를 적절히 처리하지 않으면 프로그램이 비정상적으로 종료될 수 있습니다. 예외 처리는 이러한 상황을 예방하고, 프로그램이 안정적으로 동작할 수 있도록 하는 중요한 기법입니다.
에러는 크게 네 가지 종류로 구분할 수 있습니다:
이 중, 개발자가 예측 가능하며 수정할 수 있는 에러들을 예외(Exception)라고 합니다.
예외 처리를 하지 않고 그대로 예외가 발생할 경우, 프로그램이 비정상적으로 종료될 수 있습니다. 예외 처리는 이러한 상황을 방지하고 프로그램이 안정적으로 동작할 수 있도록 합니다.
try ~ catch 문을 이용try 블록 내에서 예외가 발생할 수 있는 코드를 작성하고, catch 블록에서 해당 예외를 처리합니다.
throw를 이용 (떠넘기기)메소드 내에서 예외를 처리하지 않고, 메소드를 호출한 곳으로 예외를 떠넘깁니다.
finally 블록에서 리소스를 반납합니다.try-with-resource 문을 사용하여 자동으로 리소스를 반납합니다.다음은 예외 처리의 예제 코드입니다.
package k.exception.ex1; import java.io.IOException; import java.util.Scanner; public class Run { public static void main(String[] args) { RunException ex = new RunException(); // try-with-resource를 이용한 예외 처리 try(Scanner sc = new Scanner(System.in);) { ex.methodA(); } catch (IOException e) { System.out.println("main에서 해결"); e.printStackTrace(); } ex.myInfo(null); } }
package k.exception.ex1; public class CustomException extends RuntimeException { public CustomException() { super(); } public CustomException(String message) { super(message); } }
package k.exception.ex1; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; public class RunException { public void method01() { Scanner sc = new Scanner(System.in); try { System.out.print("a/b...a : "); int n1 = sc.nextInt(); System.out.print("a/b...b : "); int n2 = sc.nextInt(); System.out.printf("%d / %d = %d \n", n1, n2, n1 / n2); System.out.println("트라이종료"); } catch(Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } System.out.println("good bye~~"); } public void method02() { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = null; // 1. try ~ catch문 : 여기서 곧바로 예외를 처리하겠다. try { str = br.readLine(); } catch(IOException e) { e.printStackTrace(); } System.out.println("입력 : " + str); } public void methodA() throws IOException { methodB(); } public void methodB() throws IOException { methodC(); } public void methodC() throws IOException { throw new IOException(); } public void myInfo(String name) { System.out.println("안녕하세요"); if(name == null) { throw new CustomException("name을 찾을 수 없습니다."); } } }
Run.java에서는 try-with-resource 문을 사용하여 Scanner 객체를 자동으로 닫고 있습니다. methodA에서 발생한 IOException을 catch 블록에서 처리하고 있습니다.CustomException.java에서는 사용자 정의 예외 클래스를 정의하고 있습니다.RunException.java에서는 다양한 예외 처리 방법을 보여주고 있습니다. method01에서는 try ~ catch 문을 사용하여 예외를 처리하고 있으며, method02에서는 BufferedReader를 이용한 입력 처리를 하고 있습니다. methodA, methodB, methodC에서는 예외를 메소드 호출 계층으로 떠넘기고 있습니다. myInfo 메소드에서는 CustomException을 사용하여 사용자 정의 예외를 발생시키고 있습니다.