It's going to be one day 🍀

안녕하세요! 매일 매일 공부하려고 노력하는 백엔드 개발자 지망생의 공부 흔적입니다.

Back-End/Java # 교육

[Java 교육] 예외처리/trycatch&finally

2jin2 2024. 2. 6. 17:19

[공부 내용 정리]

예외처리 : 응용프로그램 에러 상황을 처리하는 것

에러 상황에서 프로그램이 강제 종료가 되는게 아니라, 에러 상황을 처리함으로써 프로그램이 정상 실행 상태가 유지되도록 할 수 있음.

→ 예외 처리 없이 에러가 나면 컴파일 자체가 안됨.
→ 이건 예외 처리를 한 상태

예외 클래스의 계층 구조

일반 예외 (Exception) : (=컴파일러 체크 예외) : 컴파일하는 과정에서 예외 처리 코드가 필요한지 검사하고 만약 예외 처리 코드가 없다면 컴파일 오류 발생.

→ 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외

실행 예외 (Runtime Exception) : 컴파일하는 과정에서 예외 처리 코드를 검사하지 않는 예외.

→ 개발자의 실수로 발생하는 예외

 

  • 모든 객체의 최상위 부모가 Object이듯, 예외도 최상위 부모는 Object
  • Throwable : 최상위 예외.
  • Error : 메모리 부족이나 심각한 시스템 오류같은 복구 불가능한 예외. 개발자가 잡을 수 없는 예외.
  • Exception : 컴파일러가 체크하는 checked exception. 단 RuntimeException은 예외.
  • RuntimeException : 컴파일러가 체크하지 않는 unchecked exception, 런타임 예외

try-catch문

try {
    <수행할 문장 1>;
    <수행할 문장 2>;
    ...
} catch(예외1) {
    <수행할 문장 A>;
    ...
} catch(예외2) {
    <수행할 문장 a>;
    ...
}

→ 첫 번째 코드의 try문에서 예외가 발생하여 catch 예외1이 수행된다면 그 다음 예외2의 catch문은 수행되지 않는다.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ExceptionSample {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("존재하지_않는_파일"));
		br.readLine();
		br.close();
	}
}
...
public class ExceptionSample {
	public static void main(String[] args) {
		**try {**
			BufferedReader br = new BufferedReader(new FileReader("존재하지_않는_파일"));
			br.readLine();
			br.close();
		**} catch (IOException e) {**
			System.out.println("error message: " + e.getMessage());
		**}**
	}
}

 

다중 catch문 작성시 주의사항

→ 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야함.

try {
	(ArrayIndexOutOfBoundsException 발생)

	(NumberFormatException 발생)
} catch(Exception e) {
	예외처리1
} catch(ArrayIndexOutOfBoundsException e) {
	예외처리2 
}

→ 예외 처리 Before

try {
	(ArrayIndexOutOfBoundsException 발생)

	(NumberFormatException 발생)
} catch(ArrayIndexOutOfBoundsException e) {
	예외처리1
} catch(Exception e) {
	예외처리2 
}

→ 예외 처리 After

 

finally

어떤 예외가 발생하더라도 반드시 실행되는 부분

public class DivideExceptionSample {
    void finalMessage() {
        System.out.println("그럼 수고하세요.");
    }

    public static void main(String[] args) {
        DivideExceptionSample sample = new DivideExceptionSample();
        int result;
        try {
            result = 5 / 0;
            sample.finalMessage();       // 이 코드는 실행되지 않는다.
        } catch (ArithmeticException e) {
            result = -1;
            System.out.println("숫자는 0으로 나눌 수 없습니다.");
        } finally {
            sample.finalMessage();    // 이곳에서는 예외와 상관없이 무조건 수행된다.
        }
    }
}
숫자는 0으로 나눌 수 없습니다.
그럼 수고하세요.

Daily Quiz

1. 예외에 대한 설명 중 틀린것은?

  1. 예외는 사용자의 잘못된 조작, 개발자의 잘못된 코딩으로 인한 프로그램 오류를 말한다. O
  2. RuntimeException의 하위 예외는 컴파일러가 예외 처리 코드를 체크하지 않는다. O
  3. 예외는 try-catch 블록을 사용해서 처리된다 O
  4. 자바 표준 예외만 프로그램에서 처리할 수 있다 X

2. try-catch-finally 블록에 대한 설명 중 틀린 것은?

  1. try { } 블록에는 예외가 발생할 수 있는 코드를 작성한다. O
  2. catch { } 블록은 try { } 블록에서 발생한 예외를 처리하는 블록이다. O
  3. try { } 블록에서 return문을 사용하면 finally { } 블록은 실행되지 않는다. X
  4. catch { } 블록은 예외의 종류별로 여러 개를 작성할 수 있다. O

3. throws에 대한 설명으로 틀린 것은?

  1. 생성자나 메소드의 선언 끝 부분에 사용되어 내부에서 발생된 예외를 떠넘긴다. O
  2. throws 뒤에는 떠넘겨야 할 예외를 쉼표(,)로 구분해서 기술한다. O
  3. 모든 예외를 떠넘기기 위해 간단하게 throws Exception으로 작성할 수 있다. O
  4. 새로운 예외를 발생시키기 위해 사용된다. X

→ 새로운 예외를 발생시키는 것은 throw이다.

4. throw에 대한 설명으로 틀린 것은?

  1. 예외를 최초로 발생시키는 코드이다. O
  2. 예외를 호출한 곳으로 떠넘기기 위해 메소드 선언부에 작성된다. X → 호출한 곳으로 떠넘기는 것은 throws이다.
  3. throw로 발생된 예외는 일반적으로 생성자나 메소드 선언부에 throws로 떠넘겨진다. O
  4. throw 키워드 뒤에는 예외 객체 생성 코드가 온다. O

5. 다음과 같은 메소드가 있을 때 예외를 잘못 처리한 것은 무엇입니까?

public void method1() throws NumberFormatException, ClassNotFoundException { ... }
  1. try { method1(); } catch(Exception e) { }
  2. void method2() throws Exception { method1() };
  3. try { method1(); } catch(Exception e) { } catch(ClassNotFoundException e) { } O
  4. try { method1(); } catch(ClassNotFoundException e) { } catch(NumberFormatException e) { }

6. 다음 코드가 실행되었을 때 출력 결과는 무엇입니까?

public class TryCatchFinallyExample {

	public static void main(String[] args) {
		String strArray[] = {"10", "23b"};
		int value = 0;
		for (int i = 0; i < 2; i++) {
			try {
				value = Integer.parseInt(strArray[i]);
			} catch (ArrayIndexOutOfBoundsException e) {
				System.out.println("인덱스를 초과하였음");
			} catch (NumberFormatException e) {
				System.out.println("숫자로 변환할 수 없음");
			} finally {
				System.out.println(value);
			}
		}
	}

}

→ 10, 숫자로 변환할 수 없음, 10

7. 로그인 기능을 Member 클래스의 login() 메소드에서 구현하려고 합니다. 존재하지 않는 ID를 입력했을 경우 NotExistsIdException을 발생시키고, 잘못된 패스워드를 입력했을 경우 WrongPasswordException을 발생시키려고 합니다. LoginExample의 실행 결과를 보고 빈칸을 채워보세요.

<LoginExample 실행결과>

// LoginExample의 실행결과
아이디가 존재하지 않습니다.
패스워드가 틀립니다.

 

https://github.com/drinkgalaxy/Ormi-Task/tree/main/DailyQuiz/0206