목차

Ch.11 예외처리

예외처리

try ~catch문의 구조

try {
    // 예외가 발생할 가능성이 있는 문장 코드
} catch (Exception1 e1) {
    // Exception1이 발생할 경우, 실행될 문장
} catch (Exception1 e2) {
    // Exception2이 발생할 경우, 실행될 문장
...
} catch (ExceptionX eX){
    // ExceptionX가 발생할 경우, 실행될 문장
}

package chapter11;

public class ExceptionEx0 {

	public static void main(String[] args) {
		System.out.println(1);
		System.out.println(2);
		System.out.println(3/0);
		System.out.println(4);
		System.out.println(5);
		System.out.println(6);
	}
	
}

package chapter11;

public class ExceptionEx {

	public static void main(String[] args) {
		System.out.println(1);
		try {
			System.out.println(2);
			System.out.println(3/0);
			System.out.println(4);
		} catch(ArithmeticException e) {
			System.out.println(5);
		}
		System.out.println(6);
	}
	
}

try 블록 안에서 예외가 발생한 경우
- 발생한 예외와 일치하는 catch 문이 있는지 확인한다.
- 만약 일치하는 catch문이 있다면, 해당 catch문의 블럭 내의 실행문을 실행하고 전체 try-catch 구문이 종료된다. 만약 일치하는 catch문이 없으면 예외 처리를 하지 못한다.
try 블록 안에서 예외가 발생하지 않은 경우
- catch 구문을 모두 확인하지 않고, 전체 try-catch 구문이 종료된다.

package chapter11;

public class ExceptionEx2 {

	public static void main(String[] args) {
		System.out.println(1);
		try {
			System.out.println(2);
			System.out.println(3);
			System.out.println(4);
		} catch(ArithmeticException e) {
			System.out.println(5); // Death 코드 (실행될 일이 없다)
		}
		System.out.println(6);
	}
	
}

:wr:다중 catch문

package chapter11;

public class ExceptionEx4 {

	public static void main(String[] args) {
		
		try {
			int[] arr = {1,2,3};
			System.out.println(arr[2]);
			System.out.println(3/1);
			Integer.parseInt("a");
		} catch(ArithmeticException e) {
			System.out.println("0으로 나눌 수 없음");
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("인덱스 범위 초과");
		}
	}
	
}

catch 문의 배치 순서
자식 Exception > Exception 순으로 배치

:wr:finally문

package chapter11;

public class ExceptionEx3 {

	public static void main(String[] args) {
		System.out.println("DB연결 시작");
		try {
			System.out.println("DB작업");
			System.out.println(3/0);
		} catch(Exception e) {
			System.out.println("DB작업 중 예외발생");
		} finally {
			System.out.println("DB연결 종료");
		}
	}
	
}

예외 강제 발생

throw 키워드 사용
throw new Exception( “ 예외 발생 ”);

package chapter11;

public class ExceptionEx5 {

	public static void main(String[] args) {
		System.out.println("프로그램 시작");
		try {
			throw new Exception("예외 발생");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		System.out.println("프로그램 종료");
	}
	
}

예외 떠넘기기

메서드에서 예외 선언

void 메서드명() throws Exception1, Exception2... {
...
}

package chapter11;

public class ExceptionEx6 {

	public static void main(String[] args) {
		try {
			first();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	static void first() throws Exception {
		second();
	}
	
	static void second() throws Exception {
		throw new Exception("예외 발생");
	}
	
}

:wr:예외 재발생

package chapter11;

public class ExceptionEx7 {

	public static void main(String[] args) throws Exception {
		try {
			first();
		} catch (Exception e) {
			System.out.println("main() 예외 처리");
			System.out.println(e.getMessage());
			throw e;
		}
	}
	
	static void first() throws Exception {
		try {
			second();
		} catch (Exception e) {
			System.out.println("first() 예외 처리");
			throw e; // 예외 재발생
		}
	}
	
	static void second() throws Exception {
		try {
			throw new Exception("예외 발생");
		} catch (Exception e) {
			System.out.println("second() 예외  처리");
			throw e; // 예외 재발생
		}
	}
	
}

	public static void main(String[] args) throws Exception {
		try	{
			first();
		}
		catch (Exception e)	{
		System.out.println("Main() 예외 처리");
		System.out.println(e.getMessage());
		throw e;
	}
}

사용자 정의 예외 클래스

class 클래스명 extends Exception {
     클래스명 (String msg) {
           super(msg);
      }
 }

LoginException.java

package chapter11;

public class LoginException extends Exception {

	LoginException(String msg) {
		super(msg);
	}
}

ExceptionEx8.java

package chapter11;

import java.util.Scanner;

public class ExceptionEx8 {
	
	static String user_id = "seo";
	static String user_pw = "smg1234";

	public static void main(String[] args) throws Exception {
		
		try {
			Scanner scan = new Scanner(System.in);
			System.out.print("아이디 : ");
			String input_id = scan.nextLine();
			
			System.out.print("비밀번호 : ");
			String input_pw = scan.nextLine();
			
			if (!user_id.equals(input_id)) {
				throw new LoginException("아이디가 올바르지 않습니다.");
			} else if (!user_pw.equals(input_pw)) {
				throw new LoginException("비밀번호가 올바르지 않습니다.");
			} else {
				System.out.println("로그인 성공");
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
	}
	
	
}

:wr:try-with-resource

기존 try~catch 방식

FileInputStream is = null;
BufferedInputStream bis = null;
try {
is = new fileInputStream("파일명")
bis = new BufferdInputStream(is);
int data = -1;
while((data = bis.read()) !=-1){
	System.out.print((char)data);
}
} finally {
// close 메서드 호출
if ((is != null) is.close();
if (bis != null) bis.close();
}

try-with-resource 방식

try(
	FileInputStream is = new FileInputStream("파일명");
	BufferedInputStream bis = new BufferdInputStream(is)
) {
	int data = -1;
	while ((data = bis.read()) != -1) {
	System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}