예외(Exception) : 잘못된 코드, 부정확한 데이터, 예외적인 상황에 의한 오류 발생
RuntimeException : 실행시 발생
ctrl + alt + t : Surround With
Thowable - getMessage(O)
Exception - getMessage(X)
RuntimeException - getMessage(X)
ArithMethicException - getMessage(X)
package ex08; import java.util.Scanner; public class DivideByZero { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); int result = 0; try { result = 10 / num; } catch (Exception e) { System.out.println("0으로 나누면 안되요"); System.out.println(e.getMessage()); // throw new RuntimeException(e); } System.out.println("나눗셈 결과 : " + result); } }
e.printStackTrace(); // 오류 추적
package ex08; import java.util.Scanner; public class DivideByZero { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); int result = 0; try { result = 10 / num; } catch (Exception e) { System.out.println("0으로 나누면 안되요"); System.out.println(e.getMessage()); e.printStackTrace(); // 오류 추적 // throw new RuntimeException(e); } System.out.println("나눗셈 결과 : " + result); } }
오류가 발생하기 전에는 어떤 예외가 필요한지 알 수 가 없음
throw : 호출자한테 예외가 위임되서 호훌자가 처리할 수 있음
throw new RuntimeException("0으로 나눌 수 없어요"); // 강제 메세지 부여
예외는 다 같이 아니라 따로 나누는 것이 좋음
문법적으로 멀티 catch가 가능하지만 나누는 것이 좋음
finally : 항상 실행됨
예외의 종류
CompileException = Checked-Exception : 실행 전에 알 수 있는 오류
RuntimeException : 실행해봐야 아는 오류
package ex08.example2; class Cal2 { public void divide(int num) throws Exception { System.out.println(10 / num); } } public class TryEx01 { public static void main(String[] args) { Cal2 c2 = new Cal2(); c2.divide(2); // 실행전 오류를 알려줌 } }
package ex08.example2; class Cal2 { // RuntimeException = 엄마가 알려주지 않았을 때 public void divide(int num) throws Exception { System.out.println(10 / num); } } public class TryEx01 { public static void main(String[] args) { Cal2 c2 = new Cal2(); try { c2.divide(0); } catch (Exception e) { System.out.println("0으로 나눌 수 없어요"); } } }
package ex08.example2; public class TryEx02 { public static void main(String[] args) { throw new RuntimeException("오류 강제 발생"); } }
연습문제
package ex08.example2; // 책임 : 데이터베이스 상호작용 class Repository { void insert() { System.out.println("레포지토리 insert 호출됨"); } void select() { } } // 책임 : 유효성 검사 class Controller { String join(String id, String pw) { if(id.length() < 4) { return "id의 길이가 4자 이상이어야 합니다."; } System.out.println("컨트롤러 회원가입 호출됨"); Repository repo = new Repository(); repo.insert(); return "회원가입이 완료되었습니다."; } void login() { System.out.println("컨트롤러 로그인 호출됨"); } } public class TryEx03 { public static void main(String[] args) { Controller con = new Controller(); String message = con.join("ssa", "1234"); System.out.println(message); } }
조건문으로 검사
package ex08.example2; // 약속 : 1은 정상, 2는 id 제약조건 실패, 3은 pw 제약조건 실패 // 책임 : 데이터베이스 상호작용 class Repository { int insert(String id, String pw) { System.out.println("레포지토리 insert 호출됨"); if (id.length() < 4) { return 2; } if (pw.length() > 50) { return 3; } return 1; } } // 책임 : 유효성 검사 class Controller { String join(String id, String pw) { System.out.println("컨트롤러 회원가입 호출됨"); if (id.length() < 4) { return "유효성검사 : id의 길이가 4자 이상이어야 합니다."; } Repository repo = new Repository(); int code = repo.insert(id, pw); if (code == 2) { return "id가 잘못됐습니다"; } if (code == 3) { return "pw가 잘못됐습니다"; } return "회원가입이 완료되었습니다"; } } public class TryEx03 { public static void main(String[] args) { Controller con = new Controller(); String message = con.join("ssar", "123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789"); System.out.println(message); } }
package ex08.example2; // 약속 : 1은 정상, 2는 id 제약조건 실패, 3은 pw 제약조건 실패 // 책임 : 데이터베이스 상호작용 class Repository2 { void insert(String id, String pw) { System.out.println("레포지토리 insert 호출됨"); if (id.length() < 4) { throw new RuntimeException("DB: id의 길이가 4자 이상 이어야 합니다."); } if (pw.length() > 50) { throw new RuntimeException("DB: pw의 길이가 50자 이하 이어야 합니다."); } } } // 책임 : 유효성 검사 class Controller2 { void join(String id, String pw) throws RuntimeException{ // join에게 위임 System.out.println("컨트롤러 회원가입 호출됨"); if (id.length() < 4) { throw new RuntimeException("Controller : id의 길이가 4자 이상 이어야 합니다."); // main의 join에게 던짐 } Repository2 repo = new Repository2(); repo.insert(id, pw); } } public class TryEx04 { public static void main(String[] args) { Controller2 con = new Controller2(); con.join("ssar", "1234"); System.out.println("회원가입 성공"); // 에러를 위임 받음 } }
try/catch로 묶기
package ex08.example2; // 약속 : 1은 정상, 2는 id 제약조건 실패, 3은 pw 제약조건 실패 // 책임 : 데이터베이스 상호작용 class Repository2 { void insert(String id, String pw) { System.out.println("레포지토리 insert 호출됨"); if (id.length() < 4) { throw new RuntimeException("DB: id의 길이가 4자 이상 이어야 합니다."); } if (pw.length() > 50) { throw new RuntimeException("DB: pw의 길이가 50자 이하 이어야 합니다."); } } } // 책임 : 유효성 검사 class Controller2 { void join(String id, String pw) throws RuntimeException{ // join에게 위임 System.out.println("컨트롤러 회원가입 호출됨"); if (id.length() < 4) { throw new RuntimeException("Controller : id의 길이가 4자 이상 이어야 합니다."); // main의 join에게 던짐 } Repository2 repo = new Repository2(); repo.insert(id, pw); } } public class TryEx04 { public static void main(String[] args) { Controller2 con = new Controller2(); try { con.join("ssar", "1234"); System.out.println("회원가입 성공"); } catch (RuntimeException e) { System.out.println("e.getMessage()"); } } }
레이어 > 책임을 분리
연습문제
package ex08.example2; class Cal3 { void divide(int num) throws Exception { System.out.println(10 / num); } } class Cal4 { void divide(int num) { try { System.out.println(10 / num); } catch (Exception e) { System.out.println("no no by zero"); } } } public class TryEx05 { public static void main(String[] args) { Cal3 c3 = new Cal3(); try { c3.divide(0); } catch (Exception e) { System.out.println("0으로 나누지 마요"); } } }
package ex08.example2; class Cal3 { void divide(int num) throws Exception { System.out.println(10 / num); } } class Cal4 { void divide(int num) { try { System.out.println(10 / num); } catch (Exception e) { System.out.println("no no by zero"); } } } public class TryEx05 { public static void main(String[] args) { Cal3 c3 = new Cal3(); try { c3.divide(0); } catch (Exception e) { System.out.println("0으로 나누지 마요"); } Cal4 c4 = new Cal4(); c4.divide(0); } }
라이브러리 작성자가throw를 사용하여 try/catch를 사용한 경우
>소유권을 가져올 수 있음
라이브러리 작성자가 try/catch만 사용한 경우 > 소유권을 뺏김
Share article