일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- CentOS8
- 파이썬
- Python
- 중첩쿼리
- CentOS
- Linux
- 자바기초스터디
- Eclipse
- 이클립스
- 시즌1
- 8kyu
- VMware
- 서울복층에어비앤비
- JavaScript
- 멀티쓰레드프로그래밍
- 오류
- 남산타워뷰
- 서울에어비앤비
- 이것이리눅스다
- monthPicker
- 사용자변경
- 주민번호마스킹
- 6kyu
- https
- Oralce
- Codewars
- java
- class파일바로보기
- 7kyu
- SQL
- Today
- Total
보통사람
[Study-9주차] 예외 처리 본문
-
목표
-
자바의 예외 처리에 대해 학습하세요.
-
-
학습할 것 (필수)
-
자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
-
자바가 제공하는 예외 계층 구조
-
Exception과 Error의 차이는?
-
RuntimeException과 RE가 아닌 것의 차이는?
-
커스텀한 예외 만드는 방법
-
0. 오류
-
정의 : 프로그램이 오작동하거나 비정상적으로 종료되는 것을 의미
-
종류
-
컴파일 에러 : 컴파일 시 발생하는 에러
-
런타임 에러 : 런타임(실행)시 발생하는 에러
-
논리적 에러 : 프로그램이 실행은 되나 의도와 다르게 동작하는 것
-
1. Exception과 Error
-
공통점 : 런타임시 발생함
-
차이점
-
Exception : 소스코드로 예방할 수 있음
-
Error : 소스코드로도 예방 할 수 없음
-
2. 자바가 제공하는 예외의 계층 구조(RuntimeException과 RE가 아닌 것)
-
RuntimeException 클래스들
-
RuntimeException 클래스와 그 하위 클래스들을 의미
-
개발자의 실수로 발생하는 예외
-
예외 처리를 필수로 안 해도 됨(Uncheked Exception)
-
런타임(실행) 시 확인함
-
예) IndexOutOfBoundsException, NullPointException 등등
-
-
Exception 클래스들
-
RuntimeException 클래스들의 제외한 나머지 클래스를 의미
-
사용자의 실수로 발생하는 예외
-
예외 처리를 필수로 해야 됨(Cheked Exception)
-
컴파일 시 확인함
-
예) FileNotFoundException, ClassNotFoundException 등등
-
3. 자바에서 예외 처리 방법
3.1. 예외 복구(try-catch-finally)
try {
// 예외가 발생할 수 있는 부분
} catch (Exception e) {
// 예외 발생시 처리 내용
} finally {
// 예외 발생 여부와 상관없이 항상 수행되어야 하는 내용
}
- 예외에 대한 적절한 처리를 하는 것을 의미함
-
예외가 발생하면 발생한 예외에 해당하는 클래스의 인스턴스가 만들어짐
-
catch
-
catch문을 차례대로 내려가면서 instanceof 연산자를 이용하여 발생한 예외와 일치하는 블록인지 확인하며 일치하는 것이 없을 경우 그 예외는 처리되지 못함
-
멀티 catch 블록
-
Java 1.7부터 여러개의 예외를 하나의 catch 블록에서 사용 할 수 있음
-
상속 관계에 있는 예외를 같이 사용 할 수 없음
-
-
// 일반 try-catch문 이용
try {
throw new NullPointerException();
} catch (NullPointerException e) {
System.out.println("## NullPointerException ##");
} catch (IndexOutOfBoundsException e) {
System.out.println("## IndexOutOfBoundsException ##");
}
// 멀티 catch문 이용
try {
throw new NullPointerException();
} catch (NullPointerException | IndexOutOfBoundsException e) {
// 이렇게 Exception마다 개별 처리 할 수도 있음
if ( e instanceof NullPointerException ) {
System.out.println("## NullPointerException ##");
} else if (e instanceof IndexOutOfBoundsException) {
System.out.println("## IndexOutOfBoundsException ##");
}
}
-
finally
-
try 블록이나 catch 블록에서 return문을 수행해도 finally 블록의 내용이 먼저 수행된 다음 return 됨
-
package com.study.halle.s1.week09;
public class TestException {
public static void main(String args[]) {
test();
System.out.println("return해서 다시 main()으로 돌아옴");
}
public static void test() {
try {
System.out.println("## try ##");
return;
} catch (Exception e) {
System.out.println("## catch ##");
} finally {
System.out.println("## finally ##");
}
}
}
[실행결과]
## try ##
## finally ##
return해서 다시 main()으로 돌아옴
-
try-with-resources문
-
Java 1.7부터 추가된 try-catch문의 변형으로 입출력 클래스들을 사용할 때 유용함
- try 블록에 자원의 객체를 생성하여 넣으면 try블록을 벗어나는 순간 자동적으로 자원을 종료시켜줌
- AutoCloseable 인터페이스의 구현체만 자동적으로 자원을 종료시켜줄 수 있음
-
// 기존 try-catch-finally문 이용
FileInputStream fis = null;
try {
fis = new FileInputStream("");
} catch (IOException e) {
e.printStackTrace();
} finally {
//
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// try-with-resources문 이용
try (FileInputStream fis = new FileInputStream("")) {
} catch (IOException e){
e.printStackTrace();
}
3.2. 예외 처리 회피
-
예외를 처리하지 않고 메소드 선언부에 throws 키워드를 이용해서 예외를 선언함(예외 전달)
-
해당 메소드를 사용하고자 하고자 할때 어떤 예외를 처리해야 되는지 쉽게 알 수 있음
-
선언한 예외뿐만 아니라 그 자식타입의 예외까지도 발생 할 수 있음
메소드 선언부 throws 예외1, 예외2 {
}
public static void test() throws Exception {
// Exception의 모든 자식 타입의 예외가 발생 할 수 있음
}
3.3. 예외 전환
-
정확한 예외로 전환 후 throw 키워드로 예외 전달함
throw 예외
throw new Exception();
4. 커스텀한 예외 만드는 방법
- 새로운 예외 클래스를 만들어서 사용 할 수 있으나 가능하면 기존의 예외 클래스를 활용하는 것 좋음
package com.study.halle.s1.week09;
public class MyException extends Exception {
private static final long serialVersionUID = 1L;
MyException(String msg) {
super(msg);
}
}
public class TestException {
public static void main(String args[]) {
try {
myException();
} catch (MyException e) {
e.printStackTrace();
}
}
static void myException() throws MyException {
throw new MyException("사용자 정의 에러 발생함");
}
}
※ 참조
Java의 정석
'Study' 카테고리의 다른 글
[Study-12주차] 어노테이션(Annotation) (0) | 2021.01.31 |
---|---|
[Study-11주차] Enum (0) | 2021.01.26 |
[Study-8주차] 인터페이스 (0) | 2021.01.04 |
[Study-7주차] 패키지 (0) | 2020.12.29 |
[Study-6주차] 상속 (0) | 2020.12.22 |