안녕하세엽! 오늘의 학습!
어제 블로그를 못올렸는데 ㅠㅠㅠㅠㅠ
감기몸살올려나봐요 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
인터페이스 배웠는데 집중도 안되고 몽롱해져서 죽는줄알았답니다 ㅠㅠㅠㅠㅠㅠ
설에 혼자 인터페이스 다시 공부해야할거같아요흑흑,,,,,,, 오늘도 몸이 안좋긴한데.....그래도,,,,,ㅎㅎ,,,,
오류의 종류
예외 - 프로그램 코드에 의해 수습될 수 있는 다소 미약한 오류
에러 - 프로그램 코드에 의해 수습될 수 없는 심각한 오류
- 카카오 데이터 센터 화재가 난거 처럼 개발자가 처리할 수 없는 상황을 에러라고 하고,
예외는 처리가능한 오류를 의미한다!
오늘은 예외에 대해 공부하였다!!ㅎ
예외 처리
- 프로그램 실행 시 발생할 수있는 예외의 발생에 대비한 코드를 작성하는것!
당연히 목적은 정상적인 실행상태를 유지하는것!!!!
public class ArrayExceptionSample {
public static void main(String[] args) {
int[] array = {3, 4, 5, 6};
System.out.println(array[5]);
}
}
예외의 예시로 배열길이를 넘어선 5를출력하게 되면
오류가 발생하는데 이것이 바로 예외!!!
오류가 났을 경우 처리하는방법은?
public static void main(String[] args) {
try {
int[] a = {1, 2, 3};
System.out.println(a[4]);
} catch (Exception e) {
//오류가 났을 경우 처리
System.out.println("Exception 처리!");
}
}
}
try catch 사용으로 처리는 가능하다!
프로그램 오류
1. 컴파일 에러 2. 런타임 에러 3. 논리적 오류
예외의 계층 구조

컴파일오류는 왼쪽 Exception에 해당한다!
런타임 오류는 런타임 exception을 상속받은 쪽!
Error는 개발자가 관여할 수 없는 부분!
그럼 컴파일오류와 런타임오류의 차이는?
컴파일오류의 특징
- 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
- 컴파일러가 체크해주는 오류 / 체크예외
public class ExceptionSample {
public static void main(String[] args) throws java.io.IOException {
BufferedReader br = new BufferedReader(new FileReader("test.txt"));
br.readLine();
br.close();
} //존재하지 않는 파일로 접근 했을 때 예외 발생
예시로 잘못된경로인 파일로 접근했을 때 오류가 발생한거처럼 실수로인해 외적인 요인일때
런타임 오류의 특징
- 프로그래머의 실수로 발생되는 예외
런타임 시점에 발생하는 오류 / 컴파일러가 체크 x


public static void main(String[] args) {
try {
int[] a = {1, 2, 3};
System.out.println(a[4]);
} catch (Exception e) {
//오류가 났을 경우 처리
System.out.println("Exception 처리!");
}
}
}
배열 범위 초과 역시 런타임 오류에 속한다!
다중 catch문 시 주의사항
public static void main(String[] args) {
BufferedReader br = null;
System.out.println("0"); //메인출력시 0출력
try {
br = new BufferedReader(new FileReader("존재하지 않는 파일")); // 에러
br.readLine(); // 제쳐두고 2번으로 들어간다
br.close();
} catch (FileNotFoundException e) {
System.out.println("FileNotFoundException 발생");
System.out.println("2"); //캐치 후 빠져나간다.
} catch (IOException e) {
System.out.println("IOException 발생");
System.out.println("3");
}
System.out.println("4"); //끝을 출력한다.
}
}
상위 예외클래스가 하위 예외 클래스보다 아래쪽에 위치해야한다는 것
try {
(ArrayIndexOutOfBoundsException 발생)
(NumberFormatException 발생)
} catch(Exception e) {
예외처리1
} catch(ArrayIndexOutOfBoundsException e) {
예외처리2 // 컴파일 오류
}
자식이 먼저 와있어야 에러가 났을 때 먼저 받아줄 수 있다!
둘다 Exception을 상속받기 때문에 상위 클래스인 Exception 블록만 선택되어 실행되기 때문에!
어떤 경우도 뒤에 온다면 의미가 없음 실행자체가 안됨! 하위클래스가 위에 와야한다는점 기억!
try {
(ArrayIndexOutOfBoundsException 발생)
(NumberFormatException 발생)
} catch(ArrayIndexOutOfBoundsException e) {
예외처리1
} catch(Exception e) {
예외처리2
}
이렇게 ArrayIndexOutOfBoundsException 가 위에 와야한다!
NumberFormatException 발생했을 땐?
> Exception 안에 속하기 때문에 예외처리 2 catch(Exception e )에서 받아준다!
finally
- 어떤 예외가 발생하더라도 반드시 실행되는 부분
void finalMessage() {
System.out.println("그럼 수고하세요.");
}
public static void main(String[] args) {
DivideExceptionSample sample = new DivideExceptionSample();
int result;
try {
result = 3 / 0;
System.out.println(result);
} catch (ArithmeticException e) {
result = -1;
System.out.println("숫자는 0으로 나눌 수 없습니다. result=" + result);
}finally {
sample.finalMessage();
}
}
이렇게 finally를 통해 예외가 발생하든 안하든 무조건 실행하게 하면?

이렇게 항상 실행되는 것을 볼 수 있다!
사용자 정의 예외와 예외발생
은행업무를 처리하는 프로그램으로 사용자 정의 예외 코드 작성해보기!
잔고 부족 예외를 발생시켜보기
public class Account {
private long balance;
public Account() {
}
public long getBalance() {
return balance;
}
public void deposit(int money) {
balance += money;
}
public void withdraw(int money) throws BalanceInsufficientException { // 사용자 정의 예외 떠넘기기
if (balance < money) {
throw new BalanceInsufficientException("잔고가 부족합니다. " + (balance - money) + " 부족함"); // 사용자 정의 예외 발생
}
balance -= money;
}
}
public class BalanceInsufficientException extends Exception{
public BalanceInsufficientException() {
}
public BalanceInsufficientException(String message) { //입력받은 메시지
super(message);
}
}
public class AccountExample {
public static void main(String[] args) {
Account account = new Account();
account.deposit(30000); //입금
System.out.println("예금액: " + account.getBalance());
try {
account.withdraw(100000); //10만원 출금하기
} catch (BalanceInsufficientException e) {
// 예외 발생 경로를 추적
System.out.println(e.getMessage());
// e.printStackTrace(); 이것을 통해서 출력을 했기 때문에 에러메시지 발생 - 사용 x
}
}
}
오오!!! 이렇게 은행 프로그램이 잔액부족을 띄우는 식인가봐요 신기하네 ㅋㅋㅋㅋㅎㅎㅎ
오늘은 이해가 안되는 정도는 아니였던거같아요!!!
인터페이스보단 이해가 잘된달까요?! ㅋㅋㅋㅎㅎㅎ 오늘은
인터페이스 복습을 다시하면 좋을 거같다는 생각에
어제 아파서 못했던 데일리 퀴즈 하면될거같습니다!!!
오늘도 공부 열심히 했구욥!
내일도 파이팅

'[4기] 백엔드 개발자 부트캠프 "오르미" ~ing > [4기] 백엔드 개발자 부트캠프 오르미 수업 복습' 카테고리의 다른 글
| [4기] 38일차 Java ( 예외처리3, 제네릭 ) (0) | 2024.02.08 |
|---|---|
| [4기] 37일차 Java ( 예외처리, 트랜잭션 ) (2) | 2024.02.07 |
| [4기] 32일차 Java ( 메소드 재정의, 추상클래스 ) (0) | 2024.02.02 |
| [4기] 31일차 Java ( final필드와 상수,접근제어자, set&get, 상속 ) (0) | 2024.02.01 |
| [4기] 30일차 Java ( class의 구성 : 필드, 생성자, 메소드 ) (0) | 2024.01.31 |