티스토리 뷰
목차
1. 예외와 예외 클래스
2. 실행 예외
3. 예외 처리 코드
4. 예외 종류에 따른 처리 코드
5. 자동 리소스 닫기
6. 예외 처리 떠넘기기
7. 사용자 정의 예외와 예외 발생
예외 처리 목적: 컴파일이 잘못되더라도 프로그램의 종료를 막는 것
[1] 예외와 예외 클래스
* 오류의 종류
- 에러
- 하드웨어의 잘못된 동작 또는 고장으로 인한 오류
- 에러가 발생되면 프로그램 종료
- 정상 실행 상태로 돌아갈 수 없음
- 프로그래머가 해결할 수 없음
- 예외
- 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인한 오류
- 예외가 발생되면 프로그램 종료
- 예외 처리 추가하면 정상 실행 상태로 돌아갈 수 있음
- 프로그램 안에서 발생하는 것들, 프로그래머가 해결할 수 있음
* 예외의 종류
- 일반(컴파일 체크) 예외 (Exception) : 예외 처리 코드 없으면 컴파일 오류 발생
- 실행 예외 (Runtime Exception) : 예외 처리 코드를 생략하더라도 컴파일이 되는 예외, 경험으로 예외 처리 코드 작성 필요함
* 예외 클래스
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/package-summary.html
java.lang (Java SE 11 & JDK 11 )
Provides classes that are fundamental to the design of the Java programming language. The most important classes are Object, which is the root of the class hierarchy, and Class, instances of which represent classes at run time. Frequently it is necessary t
docs.oracle.com
- Exception Summary에 많은 예외들이 있음
[2] 실행 예외 (Runtime Exception)
* 실행 예외 : 개발자가 실행 예외에 대해 예외 처리 코드를 넣지 않을 경우, 해당 예외가 발생하면 프로그램은 즉시 종료됨
* NullPointerException
- 객체 참조가 없는 상태 : null 값을 갖는 참조 변수로 객체 접근 연산자인 점(.)을 사용했을 때 발생
- 객체가 없는 상태에서 객체를 사용하려 했기에 예외 발생
- data 변수는 null 값을 가지고 있기 때문에, String 객체를 참조하고 있지 않음 ➡️ String 객체의 toString() 메소드를 호출하려하니까 "NullPointerException" 발생함
* ArrayIndexOutofBoundsException
- 배열에서 인덱스 범위를 초과하여 사용할 경우 발생
- 길이가 3인 int[] arr = new int[3] 배열을 선언 ➡️ arr[0] ~ arr[2]까지 사용 가능 ➡️ arr[3]을 사용하면 인덱스 범위 초과함
- args에 맞는 두개의 실행 매개값을 주지 않았기 때문에 args 배열은 아무것도 없음 ➡️ args[0], args[1]을 사용하려고 하니까 예외 발생함
* NumberFormatException
- 문자열을 숫자로 변환하는 방법
반환 타입 | 메소드명(매개변수) | 설명 |
int | Integer.parseInt(String s) | 주어진 문자열을 정수로 변환해서 리턴 |
double | Double.parseDouble(String s) | 주어진 문자열을 실수로 변환해서 리턴 |
- NumberFormatException은 숫자로 변환될 수 없는 문자 자체를 숫자로 변환하려고 할 때 발생하는 예외
- data1변수인 "100" 문자열은 숫자로 변환이 가능하기 때문에 정상적으로 실행
- data2변수인 "a100" 문자열은 숫자로 변환할 수 없기 때문에 NumberFormatException이 발생함
public class NumberFormatException{
public static void main(String[] args){
String data1 = "100";
String data2 = "a100";
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2);
int result = value1 + value2;
System.out.println(data1 + "+" + data2 + "=" + result);
}
}
* ClassCastException
- 타입 변환 : 상위클래스 ↔️ 하위클래스 / 구현클래스 ↔️ 인터페이스 간에 발생
- 이러한 관계가 아닌데 억지로 타입 변환을 시도할 경우 ClassCastException이 발생함
- Animal 타입 변수에 대입된 객체가 Dog 이므로, 다시 Dog 타입으로 변환하는 것은 아무런 문제가 없음
그러나 대입된 객체(Dog)가 아닌 다른 클래스 타입(Cat)으로 타입 변환했기 때문에 예외가 발생.
- 타입 변환 전에 타입 변환이 가능한지 instanceof 연산자로 확인하는 것이 좋음
Animal animal = new Dog();
if(animal instanceof Dog){
Dog dog = (Dog) animal;
} else if(animal instanceof Cat){
Cat cat = (Cat) animal;
}
[3] 예외 처리 코드
* 예외 발생 시 프로그램의 종료를 막고, 정상 실행을 유지할 수 있도록 처리함
- 일반 예외 : 반드시 작성해야 컴파일 가능
- 실행 예외 : 컴파일러가 체크해주지 않으며 개발자 경험에 의해 작성함
*try - catch - finally
- try{} : 예외 발생 가능 코드가 위치함
- catch(예외클래스 e) : try 블록 코드에서 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드 실행
- finally{} : 옵션으로 생략 가능. 예외 발생 여부와 상관 없이 항상 실행할 내용이 있을 경우에만 작성하면 됨
[4] 예외 종류에 따른 처리 코드
* 다중 catch
- 다양한 종류의 예외가 발생할 때, 예외별로 처리 코드를 다르게 하기 위해 여러개의 catch 블록을 작성한다.
- 여러개의 catch 블록이 있더라도, 하나의 catch 블록만 실행됨 : 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동
* catch 순서
- 자식 클래스를 위에서부터 나열한 후, 상위 클래스를 아래쪽에 위치해야 함
- Exception은 부모 예외 클래스
- catch블록은 위에서부터 차례대로 검색됨 : 상위 클래스가 위에 있다면, 아래 자식 클래스는 실행되지 않음.
- 하위 예외는 상위 예외를 상속했기 때문
* 멀티 catch
- 하나의 catch 블록에서 여러 개의 예외를 처리할 수 있도록 멀티(multi) catch 기능을 추가함
- catch 괄호 () 안에 동일하게 처리하고 싶은 예외를 | 로 연결하면 됨
[5] 자동 리소스 닫기
* try - with - resources
- resources : 데이터를 읽고 쓰는 객체
- 예외 발생 여부와 상관 없음
-사용했던 리소스 객체의 close() 메소드 호출해 리소스 닫음
- FileInputStream 객체 : 파일의 데이터를 읽음
- FileOutputStream 객체 : 파일에 쓰는 리소스 객체
- 리소스 객체
- 각종 입출력스트림, 서버소켓, 소켓, 각종 채널
- java.long.AutoCloseable 인터페이스 구현하고 있어야 함
- close()를 명시적으로 호출한 곳은 없음 : try 블록이 정상적으로 실행 완료, 혹은 예외가 발생하면 close() 메소드 호출
[6] 예외 떠넘기기
* throws
- 메소드 선언부 끝에 작성함
리턴타입 메소드명(매개변수,...) throws 예외클래스1, 예외클래스2, ...{
}
리턴타입 메소드명(매개변수, ...) throws Exception{
}
- 예외 종류별로 throws뒤에 나열하는 것이 일반적이지만, throws Exception으로 모든 예외를 간단히 떠넘길 수 있음
- 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할
- 클래스 내에서 예외가 있는 메소드 블럭을 처리하지 않고, 메소드를 가져다 쓰는 곳에서 알아서 처리하게 만드는 것
- main() 메소드에서도 throws 키워드를 사용해서 예외를 떠넘길 수 있음 ➡️ JVM이 최종적으로 예외 처리
- JVM은 예외 내용을 콘솔에 출력하는 것으로 예외 처리를 함
[7] 사용자 정의 예외와 예외 발생
* 사용자 정의 예외 클래스 선언
- 자바 표준 API에서 제공하지 않는 예외
- 애플리케이션 서비스와 관련된 예외 ex) 잔고부족, 계좌이체실패, 회원가입실패 ...
public class [ ]Exception extends [Exception|RuntimeException]{
public [ ]Exception() { }
[ ]Exception(String message) {super(message);}
}
* 예외 발생시키기 : 코드에서 예외 발생시키는 법
- 예외 객체 생성 시, 기본 생성자 또는 예외 메시지를 갖는 생성자 중 어떤 것을 사용해도 됨
- 예외 발생 코드를 가지고 있는 메소드는 내부에서 try-catch 블록으로 예외 처리할 수 있지만,
- 대부분은 자신을 호출한 곳에서 예외 처리하도록 throws 키워드로 예외 떠넘김
[8] 예외 정보 얻기
* getMessage() : 예외가 가지고 있는 Message 얻기.
- 예외 발생시킬 때 생성자 매개값으로 사용한 메시지 리턴
- 원인을 세분화하기 위해 예외 코드를 포함함
- catch() 절에서 활용
* printStackTrace()
- 예외 발생 코드를 추적해서 모두 콘솔에 출력함
- 프로그램 테스트하면서 오류를 찾을 때 유용하게 활용
'Language > JAVA' 카테고리의 다른 글
열세번째날[기본API 클래스(2) - Objects 클래스 / System 클래스/ Class 클래스 / String 클래스 / StringTokenizer 클래스 / StringBuffer /StringBuilder 클래스 / 정규 표현식 / Pattern 클래스 / Arrays 클래스] (0) | 2022.08.09 |
---|---|
열두번째날 [기본 API 클래스(1)] (0) | 2022.08.09 |
열한번째날 [중첩 클래스와 중첩 인터페이스] (0) | 2022.08.04 |
열번째날 [인터페이스] (0) | 2022.08.04 |
아홉째날 [상속 (2) 추상 클래스] (0) | 2022.08.03 |
- Total
- Today
- Yesterday
- StringTokenizer 클래스
- StringBuffer 클래스
- Math 클래스
- 기본 API 클래스
- not_in
- 역반복문
- python
- Random 클래스
- Arrays 클래스
- 딕셔너리
- Calendar 클래스
- 리스트연산자
- java.time.package
- FALSE
- 자료형
- 포장 클래스
- 순환할당
- IndexError
- StringBuilder 클래스
- Objects 클래스
- 함수
- 요소선택
- 문자열함수
- Date 클래스
- 파이썬
- 프로그램
- Format 클래스
- 리스트
- 스레드 스케줄링
- Pattern 클래스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |