티스토리 뷰
예외(Exception) 이란?
- 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것을 자바에서는 에러(Error)라고 한다. 에러는 JVM 실행에 문제가 생겼다는 것이므로, 프로그램은 실행 불능이 된다. 프로그래머는 이러한 에러에 대처할 방법이 없다.
- 예외(Exception)이란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인하여 발생하는 오류이다. 예외가 발생하면 프로그램이 종료된다는 점은 에러와 동일하나, 예외처리(Exception Handling)을 통해 프로그램을 종료하지 않고 정상 실행상태를 유지할 수 있다.
예외(Exception) 예시
- 존재하지 않는 파일을 열려고 시도하는 경우 FileNotFoundException 예외가 발생한다.
BufferedReader br = new BufferedReader(new FileReader("나없는파일"));
br.readLine();
br.close();
Exception in thread "main" java.io.FileNotFoundException: 나없는파일 (지정된 파일을 찾을 수 없습니다)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileReader.<init>(Unknown Source)
...
- 0으로 다른 숫자를 나누는 경우 ArithmeticException 예외가 발생한다.
int num = 6/0;
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Test.main(Test.java:14)
- 배열의 인덱스 밖에 있는 값을 가져오려는 경우 ArrayIndexOutOfBoundsException 예외가 발생한다.
int[] num = {1,2,3};
System.out.println(num[3]);
// a[3]은 a 배열의 4번째 값이므로 a배열에서 구할 수 없는 값이다.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at Test.main(Test.java:17)
자바에서 예외 처리 방법(try, catch, throw, throws, finally)
- 프로그램에서 예외가 발생했을 때 갑작스러운 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 코드를 예외 처리 코드라고 한다.
- 자바의 예외에는 일반 예외(Checked Exception)와 실행 예외(Unchecked Exception)가 있다.
- 일반 예외(Checked Exception)는 자바 소스를 컴파일 하는 과정에서 예외처리 코드가 필요한지 검사하기 때문에 Checked Exception이라고 부른다. 만약 예외 처리 코드가 없다면 컴파일 오류가 발생한다.
- 실행 예외(Unchecked Exception)는 자바 소스를 컴파일 하는 과정에서 예외 처리 코드를 검사하지 않기 때문에 Unchecked Exception이라고 부른다. 실행 예외는 자바 컴파일러가 체크를 하지 않기 때문에 오로지 개발자의 경험에 의해 예외 처리 코드를 삽입해야 한다.
[ try-catch-finally ]
try {
...예외 발생 가능 코드;
} catch(예외클래스 e) {
...예외 처리 코드;
}finally{
...항상 실행 코드;
}
- try 블록에는 예외 발생 가능 코드가 위치한다. try 블록에서 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드를 실행한다.
- 그리고 finally 블록 코드를 실행한다. finally 블록은 예외 여부와 상관없이 실행되며, 심지어 try 블록과 catch 블록에서 return 문을 사용하더라도 실행된다.
- try 블록의 코드가 예외 발생 없이 정상 실행되면 catch 블록의 코드는 실행 되지 않고 finally 블록의 코드를 실행한다.
[ 다중 catch ]
- catch 블록이 여러 개 여도 하나의 catch 블록만 실행된다. try 블록에서 동시 다발적으로 예외가 발생하지 않고, 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동하기 때문이다.
- 다중 catch 블록을 작성할 때 주의할 점은 상위 예외 클래스가 하위 예외 클래스보다 아래 쪽에 위치해야한다는 것이다. try 블록에서 예외가 발생하면, 예외를 처리할 catch 블록을 위에서 부터 차례대로 검색된다. 만약 상위 예외 클래스의 catch 블록이 위에 있다면, 하위 예외 클래스의 catch 블록은 실행될 수 없다. Unreachable catch block
[ 멀티 catch ]
- 자바 7 부터 하나의 catch 블록에서 여러 개의 예외를 처리할 수 있도록 멀티 catch 기능을 추가했다.
- catch 괄호() 안에 동일하게 처리하고 싶은 예외를 ' | ' 로 연결한다.
[ throw 와 throws ]
- throw는 예외를 강제로 발생시킬 수 있다. 코드를 작성하는 프로그래머가 강제로 예외를 발생시키는 것이다.
// throw 문법
throw new 발생시킬 예외;
- throws는 자신을 호출하는 메소드에 예외처리의 책임을 떠넘긴다.
[ 예외를 떠넘기는 이유(throws) ]
예외가 발생한 경우 굳이 메서드 내에서 try-catch 문으로 예외를 처리하지 않고 throws 문으로 떠넘기는 이유는,
- 첫째, 메서드 선언분에 선언된 throws문을 통해 해당 API 를 사용했을 때 어떤 예외가 발생할 수 있는지를 예측할 수 있다.
- 둘째, 현재 메서드 내에서 예외를 처리할 필요가 없다고 판단했을 경우이다. 예외처리에는 생각보다 많은 코드가 필요하게 되며 이는 버그를 만들기 쉽다. 또한, API를 만드는데 있어서 내가 처리하기 보다는 내가 만든 API를 사용하는 다른 개발자에게 원하는 처리를 하도록 기회를 줄 수 있다.
'Study > Java' 카테고리의 다른 글
[스터디 10주차] 멀티쓰레드(Multi-thread) 프로그래밍 (0) | 2022.02.20 |
---|---|
[스터디 9주차] 자바가 제공하는 예외 계층 구조 (0) | 2022.02.13 |
[스터디 8주차] 인터페이스(Interface) (0) | 2022.01.30 |
[스터디 7주차] 접근 지정자 (0) | 2022.01.22 |
[스터디 7주차] Classpath (0) | 2022.01.22 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 자바
- CS
- 완전탐색
- 정렬
- 자료구조
- It
- 연결리스트활용
- Greedy sort
- 리스트2
- 자료구조와알고리즘 23강
- https
- 리스트 복사
- 알고리즘
- 리스트
- 프로세스 주소공간
- 이차 리스트
- SW
- 코드업 기초
- 운영체제
- 네트워크
- 파이썬
- CS 스터디
- 보험
- 데이터베이스
- 스터디
- 리스트함축
- 이진탐색
- CS.
- 프로그래머스강의
- 프로그래머스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함