예외와 에러
- 에러 : 하드웨어의 고장 또는 JVM 자체에서 발생하는 오류를 의미하며, 개발자가 대처할 수 없는 오류를 의미한다.
- 예외 : 개발자가 프로그램을 작성하는 과정에서의 실수 또는 사용자의 잘못된 조작에 의해 발생하는 오류를 의미하며, 개발자가 대처할 수 있는 오류를 의미한다.
- 에러는 개발자가 해결할 수 있는 방법이 없지만 예외는 예외 처리(Exception Handling)을 통해 에러를 피하여 프로그램이 비정상적으로 종료되는 것을 막을 수 있다.
예외 클래스의 구조
Error 클래스와 Exception 클래스의 상속 구조
- 예외의 최상위 클래스는 Exception 클래스, 에러의 최상위 클래스는 Erorr 클래스다.
- 두 개의 클래스 모두 Throwable 클래스를 상속하고 있다.
- 에러와 예외 모두 Throwable의 기능을 사용할 수 있다.
예외 클래스의 상속 구조
- 예외의 최상위 클래스 Exception 클래스는 다시 일반 예외(Checked Exception)와 실행 예외(Unchecked Exception)으로 나뉜다.
- 일반 예외 클래스 : 컴파일 전에 예외가 발생할 문법이 있는지 검사하며, 예외 처리를 하지 않으면 문법 오류가 발생한다.
- 실행 예외 클래스 : 실행할 때 발생하는 예외로, 예외 처리를 하지 않아도 문법 오류가 발생하지 않고 프로그램이 실행되지만, 예외가 발생하는 코드를 만나면 예외를 발생시키며 프로그램이 강제 종료된다.
일반 예외 클래스(Checked Exception) 종류
Interrupted Exception
- 일정 시간 해당 쓰레드를 일시정지 상태로 만드는 Thread.sleep() 메서드를 사용할 때 발생하는 예외
ClassNotFoundException
- 클래스 파일명을 인자로 넣어 해당하는 클래스를 반환하여 동적으로 메모리에 로딩하는 Class.forName("패키지명.클래스명") 메서드를 사용할 때 해당 클래스가 존재하지 않을 때 ClassNotFoundException이 발생하기 때문에 반드시 예외 처리를 해야한다.
IOException
- 콘솔이나 파일에 데이터를 쓰거나 읽을 때 발생한다.
FileNotFoundException
- 파일을 읽어올 때 해당 경로에 파일이 존재하지 않으면 발생한다.
CloneNotSupportedException
- Object.clone() 메서드를 이용하여 객체를 복사할 때 Clonable 인터페이스를 상속하지 않은 클래스를 복사하려고 한다면 CloneNotSupportedException이 발생한다.
실행 예외 클래스(Runtime Exception / Unchecked Exception) 종류
문법 오류가 발생하지 않아 예외 처리를 하지 않아도 컴파일과 프로그램 실행이 가능하지만, 실행 중 예외를 발생시키는 코드를 만나면 프로그램이 강제 종료된다.
ArithmeticException
- 연산 자체가 불가능할 때 발생하는 예외
public class Main {
public static void main(String[] args) {
System.out.println(1 / 0);
}
}
ClassCastException
- 불가능한 다운 캐스팅을 진행했을 때 발생하는 예외
public class Main {
public static void main(String[] args) {
A a1 = new B();
A a2 = new A();
System.out.println("A a1 -> B a1 = " + (a1 instanceof B));
a1 = (B) a1;
System.out.println("A a2 -> B a2 = " + (a2 instanceof B));
a2 = (B) a2;
}
}
class A {}
class B extends A {}
ArrayIndexOutOfBoundsException
- 해당 배열의 범위가 아닌 인덱스를 사용했을 때 발생하는 예외
public class Main {
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5}; // 배열의 길이 5, 사용 가능 범위 0 ~ 4
System.out.println(arr[0]); // 사용 가능 범위
System.out.println(arr[1]); // 사용 가능 범위
System.out.println(arr[5]); // 사용 가능 범위 벗어남
}
}
NumberFormatException
- Integer.parseInt("문자열") 또는 Double.parseDouble("문자열")을 이용하여 문자열을 숫자로 변환할 때 해당 문자열이 숫자 형식이 아닐 경우 발생하는 예외
public class Main {
public static void main(String[] args) {
String str1 = "1234";
String str2 = "12.123";
String str3 = "천이백삼십사";
System.out.println(Integer.parseInt(str1));
System.out.println(Double.parseDouble(str2));
System.out.println(Integer.parseInt(str3)); // 예외 발생
}
}
NullPointerException
- 참조 변수가 실제 객체를 가리키고 있지 않은 상황에서 참조 변수의 참조값을 호출할 때 발생하는 예외
public class Main {
public static void main(String[] args) {
String str1 = null;
System.out.println(str1); // str1 안에 들어 있는 것을 호출하기 때문에 예외 발생 X
System.out.println(str1.charAt(0)); // 예외 발생 O
}
}
'Langauge > Java-basic' 카테고리의 다른 글
[Java] 예외처리(Exception Handling) (0) | 2022.08.17 |
---|---|
[Java] 익명 이너 클래스(Anonymous Class) (0) | 2022.08.11 |
[Java] 이너 인터페이스(중첩 인터페이스) (0) | 2022.08.11 |
[Java] 인터페이스란? (0) | 2022.08.07 |
[Java] 추상 클래스와 추상 메소드 (abstract 제어자) (0) | 2022.08.05 |