[공부 내용 정리]
예외처리 : 응용프로그램 에러 상황을 처리하는 것
에러 상황에서 프로그램이 강제 종료가 되는게 아니라, 에러 상황을 처리함으로써 프로그램이 정상 실행 상태가 유지되도록 할 수 있음.
예외 클래스의 계층 구조
일반 예외 (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. 예외에 대한 설명 중 틀린것은?
- 예외는 사용자의 잘못된 조작, 개발자의 잘못된 코딩으로 인한 프로그램 오류를 말한다. O
- RuntimeException의 하위 예외는 컴파일러가 예외 처리 코드를 체크하지 않는다. O
- 예외는 try-catch 블록을 사용해서 처리된다 O
- 자바 표준 예외만 프로그램에서 처리할 수 있다 X
2. try-catch-finally 블록에 대한 설명 중 틀린 것은?
- try { } 블록에는 예외가 발생할 수 있는 코드를 작성한다. O
- catch { } 블록은 try { } 블록에서 발생한 예외를 처리하는 블록이다. O
- try { } 블록에서 return문을 사용하면 finally { } 블록은 실행되지 않는다. X
- catch { } 블록은 예외의 종류별로 여러 개를 작성할 수 있다. O
3. throws에 대한 설명으로 틀린 것은?
- 생성자나 메소드의 선언 끝 부분에 사용되어 내부에서 발생된 예외를 떠넘긴다. O
- throws 뒤에는 떠넘겨야 할 예외를 쉼표(,)로 구분해서 기술한다. O
- 모든 예외를 떠넘기기 위해 간단하게 throws Exception으로 작성할 수 있다. O
- 새로운 예외를 발생시키기 위해 사용된다. X
→ 새로운 예외를 발생시키는 것은 throw이다.
4. throw에 대한 설명으로 틀린 것은?
- 예외를 최초로 발생시키는 코드이다. O
- 예외를 호출한 곳으로 떠넘기기 위해 메소드 선언부에 작성된다. X → 호출한 곳으로 떠넘기는 것은 throws이다.
- throw로 발생된 예외는 일반적으로 생성자나 메소드 선언부에 throws로 떠넘겨진다. O
- throw 키워드 뒤에는 예외 객체 생성 코드가 온다. O
5. 다음과 같은 메소드가 있을 때 예외를 잘못 처리한 것은 무엇입니까?
public void method1() throws NumberFormatException, ClassNotFoundException { ... }
- try { method1(); } catch(Exception e) { }
- void method2() throws Exception { method1() };
- try { method1(); } catch(Exception e) { } catch(ClassNotFoundException e) { } O
- 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
'Back-End > Java # 교육' 카테고리의 다른 글
[Java 교육] 자동 리소스 닫기/중간정리/제네릭 (1) | 2024.02.08 |
---|---|
[Java 교육] 사용자 정의 예외/트랜잭션 (1) | 2024.02.07 |
[Java 교육] 오버라이딩/인터페이스/다형성 (1) | 2024.02.05 |
[Java 교육] final/상수/Getter,Setter/상속 (0) | 2024.02.01 |
[Java 교육] 메소드 (0) | 2024.01.31 |