오류(Error)
오류엔 두 가지 종류가 존재한다.
1. 컴파일 오류: 코드 작성 중 발생하는 문법적 오류. 요즘은 컴파일러가 잘되어있어서 컴파일 단계에서 모두 잡아준다.
2. 실행 오류: 설계 로직이 잘못되어 생기는 오류. 런타임에러(프로그램 중지)가 있다. 예외처리를 통해 프로그램의 비정상 종료를 막고 로그를 남기는 것을 목표로 한다.
오류와 예외
시스템 오류
가상머신에서 발생. 프로그래머가 처리할 수 없다. 동적 메모리를 다 사용한 경우나 stack over flow 같은 오류가 여기 해당한다.
예외
프로그램에서 제어할 수 있는 오류. 읽어내려는 파일이 없다/소켓 연결 오류 등
예외 클래스
모든 예외 클래스의 최상위 클래스는 Exception클래스이다.
예외 처리
try-catch
try {
예외가 발생할 수 있는 코드
}catch (처리할 예외 타입 e){
try 블록 안에서 예외가 발생했을 때 수행되는 부분
}
public static void main(String[] args) {
int[] arr = new int[5];
try {
for (int i = 0; i <= 5; i++) {
System.out.println(arr[i]);
}
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("error: " + e);
}
}
try-catch-finally
try {
예외가 발생할 수 있는 코드
}catch (처리할 예외 타입 e){
try 블록 안에서 예외가 발생했을 때 수행되는 부분
}finally {
예외 발생 여부와 상관없이 항상 수행되는 부분
리소스를 정리하는 코드를 주로 쓴다.
}
try-with-resources
리소스를 자동으로 해제하도록 제공해주는 구문 ex) 파일 오픈한 후 자동으로 닫기
해당 리소스가 AutoCloseable을 구현한 경우 close()를 명시적으로 호출하지 않아도 try 블록 내에서 오픈된 리소스에 대해 close가 자동 호출된다.
자바7부터 사용가능
public class AutoCloseObj implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("close()가 실행되었습니다.");
}
}
public class AutoCloseTest {
public static void main(String[] args) {
AutoCloseObj obj = new AutoCloseObj();
// 자바9부터는 obj만 선언해도 사용가능
try (AutoCloseObj obj2 = obj) {
throw new Exception();
} catch (Exception e) {
System.out.println(e);
}
}
}
FileInputStream의 경우 AutoCloseable을 구현하고 있다.
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("a.txt")) {
} catch (FileNotFoundException e) {
System.out.println(e);
} catch (IOException e) {
System.out.println(e);
}
}
'프로그래밍 언어 > java' 카테고리의 다른 글
[java] 예외처리2 (0) | 2021.04.05 |
---|---|
[java] Class 클래스, 자바 리플렉션 (0) | 2021.03.18 |
[java] String, Wrapper 클래스 (0) | 2021.03.18 |
[java] Object 클래스 (0) | 2021.03.18 |
[java] 인터페이스 다중 상속 (0) | 2021.03.12 |
댓글