코드 피드백
에러(Error) : 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생
예외(Exception) : 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류
공통점 | 차이점 |
---|---|
발생하면 프로그램 즉시 종료 | 예외는 예외 처리를 통해 프로그램을 종료하기 않고 정상 실행 상태가 유지되도록 할 수 있음 |
: 자바 컴파일러가 체크를 하지 않기 때문에 오로지 개발자의 경험에 의해서 예외 처리 코드를 삽입해야함 (넣지 않을 경우 종료됨)
NullPointerException : 객체 참조가 없는 상태, null값을 갖는 참조 변수를 도트 연산자로 접근하려고 할 때 발생
ArrayIndexOutOfBoundsException
: 배열에서 인덱스 범위를 초과하여 사용할 경우 발생
NumberFormatException
: 숫자로 변환될 수 없는 문자를 숫자로 변환하려고 시도할 때 발생 (ex. "a100")
ClassCastException
: 상위-하위클래스, 구현클래스-인터페이스 간의 타입 변환이 아닌 클래스를 강제로 타입 변환하려고 시도할 때 발생
Sample s2 = null;
// System.out.println(s2.toString()); NullPointerException
int arr[] = { 1, 2, 3 };
System.out.println(arr[1]);
// System.out.println(arr[3]); ArrayIndexOutOfBoundsException
String str1 = "5";
String str2 = "5A";
int num1 = Integer.parseInt(str1);
// int num2 = Integer.parseInt(str2); NumberFormatException
Parent p1 = new Parent();
Child c1 = new Child();
Parent p2 = new Child(); // 부모 타입 변수에 자식 객체
Child c2 = (Child)p2; // 강제형변환
// Child c3 = (Child)p1; ClassCastException
: 예외 발생시 프로그램 종료를 막고 정상 실행 유지할 수 있도록 처리하는 것
Sample s2 = null;
try {
s2.toString();
} catch(Exception e) {
// try문에서 오류 발생하면 이곳으로
System.out.println(e.getMessage());
System.out.println("예외 발생!!!!!!!1111");
e.printStackTrace();
} finally {
// 1. try문에서 오류 발생 안한 경우
// 2. try문에서 오류 발생해서, catch문 수행한 이후
// => finally문은 항상 실행!
System.out.println("항상 실행!");
}
: catch 블록이 여러 개여도 하나의 catch문만 실행 (try문에서 하나의 예외가 발생하면 즉시 실행을 멈추고 catch문으로 가기 때문에)
: 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 함
: 하위도 결국 상위를 상속한 것이기 때문에 하위가 상위보다 위에 위치하면 하위 예외 클래스의 catch문은 실행되지 않음
try {
System.out.println(s2.toString());
} catch(NullPointerException e) { // 더 작은 catch가 앞쪽으로 와야함
System.out.println("구체적이고 작은 예외 발생!!!!!!!");
} catch(Exception e) {
System.out.println("좀 더 상위의 예외 발생!!!!!!!1111");
} finally {
System.out.println("결국에 항상 실행되는 finally!!!!");
}
: 괄호안에 or연산자(|)를 통해 한 블록에서 여러개의 예외를 처리할 수 있게 함
: 예외 발생 여부와 상관없이 사용했던 리소스 객체의 close메소드를 호출해서 안전하게 리소스를 닫아주는 역할
: 조건 : 리소스 객체가 java.lang.AutoCloseable 인터페이스를 구현하고 있어야함
ex.
try(FileInputStream fis = new FileInputStream('file.txt')) {
...
} catch(IOException e) {
...
}
=> try 블록이 정상적으로 실행을 완료했거나 도중에 예외가 발생하게 되면 자동으로 FileInputStream의 close 메소드가 호출
=> try 블록에서 예외가 발생하면 우선 close로 리소스를 닫고 catch 블록 실행