[JAVA] 47. 예외처리

편준민's avatar
Feb 18, 2025
[JAVA] 47. 예외처리
💡
세상에 완벽한 프로그램은 없다. 예외적인 상황에서 오류가 발생 할 수 있는데, 이것을 해결하는것이 예외처리이다.

오류 발생 코드

package ex15; public class DivideByZeroOk { public static void main(String[] args) { int result = 10 / 0; System.out.println(result); } }
notion image
0으로는 아무것도 나눌 수 없다는 오류 발생

1. 예외처리 방법 (Catch)

package ex15; public class DivideByZeroOk { public static void main(String[] args) { try { int result = 10 / 0; System.out.println(result); } catch (ArithmeticException e) { System.out.println("괜찮아"); } } }
notion image

2. 예외의 종류

notion image

예외의 종류는 2가지가 있다.

  • RuntimeException (예상 불가능)
    • 해당 오류는 내가 예상하지 못하는 오류들을 말한다. 예를 들어보면 내가 일본 여행을 갔다. 여행을 간 일본에서 내가 소매치기를 당할지, 폭우가 쏟아져 가고 싶은 가게가 문을 닫는다던지 하는 예상이 불가능한 부분의 오류이다.
    • 개발환경에서의 특징으로는 코드에서 오류를 표시해주지 않는다. 그러므로 오류가 발생하는지 안 하는 지는 테스트를 해보아야 알 수 있다. 테스트 후에 오류가 발생을 한다면 try-catch를 이용하여 오류를 잡아주면 된다.
  • CheckedException (예상 가능)
    • 해당 오류는 내가 예상이 가능한 범위의 오류이다. 예를 여행으로 또 들어보자면 여행을 가기 위해서는 여권이 필요하다. 여권을 챙기지 않으면 가지 못한다는 예측 가능한 것과 에베르스트 산을 등산을 하기 위한 여행인데 겉옷을 챙기지 않으면 춥다는 사실은 이미 예상이 가능하니 겉옷을 챙겨가는 것처럼 예상이 가능한 부분의 오류이다.
    • 개발환경에서의 특징은 코드에서 빨간 밑줄로 표시를 해준다. 그러면 테스트를 해보지 않아도 실행이 안되고, 빨간 밑줄이 있으면 try-catch를 사용하여 오류를 잡아주면 된다.

3. 연쇄적인 작동이 있는 메서드를 효율적으로 처리

연쇄적인 작동이 있는 메서드에서는 return을 많이 사용하여 코드를 만들면, 복잡해지고 초보자가 실수를 한다. 또한 이미 많은 개발자들이 return을 사용하지 않고 오류를 잡기 때문에 남의 코드를 사용 할 때에 불편하다. 우리가 retrun을 사용하지 않고 오류를 처리하기 위해서는 2가지를 알아야한다. retrun은 정상만 retrun하고 비정상은 강제로 예외처리하면 복잡해지지 않는다
  • 강제로 예외를 만드는 법
    • 강제로 예외를 만드는 법은 throw를 사용하면 된다.
  • 예외를 위임하는 법
    • 예외를 가장 마지막 작업인 호출하는 부분에 위임을 하고 try catch를 이용하여 오류를 잡아주면된다.

return을 이용하여 예외처리 하는 방법

package ex15; class Repository { // 1이면 존재하는 회원, -1이면 존재하지 않음 int findIdAndPw(String id, String pw) { System.out.println("레포지토리 findIdAndPw 호출됨"); if (id.equals("ssar") && pw.equals("5678")) { return 1; } else { return -1; } } } // 책임 : 유효성 검사 class Controller { String login(String id, String pw) { System.out.println("컨트롤러 로그인 호출됨"); if (id.length() < 4) { return "유효성검사 : id의 길이가 4자 이상이어야 합니다."; } if (pw.length() < 4) { return "유효성검사 : id의 길이가 4자 이상이어야 합니다."; } Repository repo = new Repository(); int code = repo.findIdAndPw(id, pw); if (code == -1) { return "id 혹은 pw가 잘못됐습니다"; } return "로그인이 완료되었습니다"; } } public class Try03 { public static void main(String[] args) { Controller con = new Controller(); String message = con.login("ssar", "123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789"); System.out.println(message); } }

사용이유

언제나 같은 타입을 return 할 수 없기 때문
  • String 타입의 변수인데 true의 return값은 String 이고, false의 return값은 Int가 될 수도 있다.
  • if는 오류 이전에 잡아야하고 throw를 사용하면 오류 이후에 잡아도 된기 때문에 편리하다.

효율적으로 예외를 처리하는 방법(throw 사용)

package ex15; class Repository { // 1이면 존재하는 회원, -1이면 존재하지 않음 void findIdAndPw(String id, String pw) { System.out.println("레포지토리 findIdAndPw 호출됨"); if (!(id.equals("ssar") && pw.equals("5678"))) { throw new RuntimeException("아이디 혹은 비번 틀림"); } } } // 책임 : 유효성 검사 class Controller { void login(String id, String pw) { System.out.println("컨트롤러 로그인 호출됨"); if (id.length() < 4) { throw new RuntimeException("id 길이가 최소 4자 이상이어야 해요"); } if (pw.length() < 4) { throw new RuntimeException("pw 길이가 최소 4자 이상이어야 해요"); } Repository repo = new Repository(); repo.findIdAndPw(id, pw); } } public class Try03 { public static void main(String[] args) { Controller con = new Controller(); try { con.login("ssar", "123"); } catch (Exception e) { System.out.println(e.getMessage()); } } }
 
Share article

YunSeolAn