오류
- 컴파일 오류 : 코드에 문제가 있어 실행안됨(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로 예외처리를 하는 것과 차이는?
- if 문으로도 처리는 가능하나 try-catch는 예외처리 전용 문법임
- 코드상에서 쉽게 파악이 가능하고, if사용하는 것보다 훨씬 간편함
- if문으로 로직을 구현하면 스코프 관리가 힘듦. 지역변수, 리턴 데이터, 오류처리(로깅), 메모리해제 문제 등..
'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 |