====== 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();
}