Coding/언어-JAVA

JAVA 예외(try-catch) #Day7

꿀딴지- 2023. 8. 11. 13:20

오류

  • 컴파일 오류 : 코드에 문제가 있어 실행안됨(IDE 에서 시각적으로 보여서 수정이 용이함)
  • 런타임 오류 : 컴파일 시에는 문제가 없다가, 프로그램 동작 중에 오류 발생.
    • 에러(error)-코드를 통해 처리불가(ex. 메모리 부족, stack overflow 등)
    • 예외(exception) - 코드실행 중에 발생하는 예기치 못한 상황이 발생하여 비정상적인 종료 발생(ex.배열인덱스 초과, 객체 생성 전 사용 등)
    • exit code 1 : 비정상 종료 → 예외처리하면 이런 경우에도 정상종료됨

→ Exceptions(예외처리 대상) - 모든예외의 조상클래스(Exception e)

      → Runtime Exceptions : unchecked 예외, 컴파일 과정에서 예외처리가 강제되지 않음
        (ex .형변환오류, 배열위치 초과, null 등..)       
      → OtherExceptions : checked예외, 컴파일러가 예외처리 강제함

try{
//여기 있는 코드를 try해보고,(예외가 발생할 가능성이 있는 코드)
}catch(예외타입 참조변수){
//'예외타입'에 해당하는 예외를 catch한다면, 참조변수에 할당해줘.
//참조 변수를 활용해서 처리를할테니, 여기 있는 코드를 실행해
//예외 케이스 별로 catch 여러개 만들 수 있음
}finally{
//예외여부에 상관없이 여기 코드는 무조건 실행해
}

try+catch(s)

try+catch(s)+finally

try+finally

  • try에서 예외가 발생하더라도 finally 실행됨
  • catch문 안에 return이 있어도 finally가 실행됨

try문 안에서 예외가 발생한 시점에 catch 문으로 넘어가기 때문에, try문 내에 있더라도 예외가 발생한 아래줄은 실행되지 않음


예외 발생시키기(Throw)

  • 예외를 발생시키는 키워드 throw
  • 프로그램이 실행되는 과정에서 필요에 의해서 예외를 만듦
  • throw new Exception(”예외문구”) → catch에서 받아서 처리

사용자 정의(커스텀) 예외

  • 클래스명 extends Exception : excetpion 상속 필수로 하여 사용자 정의 예외 클래스 작성

예외처리 미루기(Throws)

  • 자신을 호출한 곳으로 예외를 전가시킴 -> 호출한 곳에서 처리
  • 장점 : 예외를 발생시키면서 바로 처리하고 있음 → 메서드를 호출하는 곳에서 처리할 수 있도록 전가시킬 수 있음 → 예외들을 모아둘 수 있음.
public class ModifyException {
public static void main(String[] args) {
Account account = new Account();
try { //thrwos로 예외를 전가받아 try - catch 구문 필요
account.wirhdraw(100_000_000);
System.out.println();
}
catch (InsufficientBalance | ExceedWithdrawLimit e) { //여러개 예외 한번에 처리
System.out.println(e.getMessage());
}
}
}
//커스텀 예외, extends Exception 필수
class InsufficientBalance extends Exception {
public InsufficientBalance(String message) {
super(message);
}
}
class Account {
private int balance=100_000;
private static final int LIMIT = 1_000_000;
// throws로 예외전가 : 발생하는 예외 전부 작성
public void wirhdraw(int money) **throws InsufficientBalance, ExceedWithdrawLimit** {
if (balance < money) {
throw new InsufficientBalance("잔고부족") //throw로 예외를 발생시킴(커스텀예외, 정의된 예외 가능)
}
else if (money > LIMIT) {
throw new ExceedWithdrawLimit("한도초과");
}
}
}

참고1. 예외메시지 출력을 위해 자주 사용되는 메서드

  • e.printStackTrace();
  • e.getMessage()
  • e.toString()

참고2. Try With Resources

  • try 파라미터에서 바로 객체 생성 가능 → 닫는 부분을 구현하지 않아도 자동으로 닫힘(catch 구현 필요없음) → implements AutoCloseable

 

Q. if else로 예외처리를 하는 것과 차이는?

'Coding > 언어-JAVA' 카테고리의 다른 글

JAVA 에너테이션 #Day7  (0) 2023.08.12
JAVA 열거형(Enum) #Day7  (0) 2023.08.11
JAVA Generic 타입제한 2/2 #Day6  (0) 2023.08.10
JAVA Generic 2/1 #Day6  (0) 2023.08.09
JAVA Collection Framework 2/2 #Day5  (0) 2023.08.07