1. 예외와 에러의 차이점
1) 예외
- 개발자가 해결할 수 있는 오류
- 오류가 발생했을 때 차선책을 선택
- 예외의 최상위 클래스 Exception 클래스 ->Throwable 클래스 상속
2)에러
- 자바 가상 머신 자체에서 발생하는 오류
- 개발자가 해결할 수 없는 오류
- 에러의 최상위 클래스 Error 클래스 -> Throwable 클래스 상속
- Error 클래스와 Exception 클래스의 상속 구조
2. 예외 클래스의 상속구조
-Exception 클래스는 일반예외(checked exception)클래스와 실행예외(unchecked exception) 클래스로 나뉨
1) 일반 예외
- Exception 클래스에서 직접 상속받은 예외 클래스들이 처리
- 컴파일 전에 예외발생 문법을 검사
- 예외 처리를 하지 않으면 문법 오류가 발생
2) 실행 예외
- RuntimeException 클래스를 상속받은 예외 클래스들이 처리
- 실행할 떄 발생하는 예외
- 예외처리를 따로 하지 않더라도 문법 오류가 발생하지 않음
3. 일반 예외 클래스
1) InterruptedException
- Thread.sleep(시간) 메서드
->일정 시간 동안 해당 쓰레드를 일시정지 상태로 만드는 Thread 클래스의 정적 메서드
->일반 예외가 발생할 수 있기 떄문에 반드시 예외 처리를 해야 함
public class A {
public static void main(String[] ar) {
Thread.sleep(1000);
}
}
2) ClassNotFoundException
- Class.forName("패키지명. 클래스명")
-> 클래스를 동적으로 메모리에 로딩하는 메서드
-> 해당 클래스의 정보를 담고 있는 Class 타입의 객체를 리턴
-> 클래스를 메모리에 동적으로 로딩하는 과정에서 해당 클래스가 존재하지 않을때는 ClassNotFoundException이 발생하므로 이에 대한 예외처리 필요
public class A {
public static void main(String[] ar) {
Class cls = Class.forName("java.lang.object");
}
}
3) IOException
- 자바 입출력 부분에서 자주 보게 될 일반 예외
- 콘솔이나 파일에 데이터를 쓰거나(write()) 읽을(read()) 떄 발생
- 반드시 IOException에 대한 예외처리를 해야함
public class A {
public static void main(String[] ar) {
InputStreanReader isr = new InputStreanReader(System.in);
isr.read();
}
}
4) FileNotFoundException
- 파일을 읽을 때 해당 경로에 파일이 없으면 FileNotFoundException이 발생
- 실제 파일의 존재 유무와는 상관없이 파일이 존재하지 않을 가능성이 있는 코드이기 때문에 반드시 예외처리
public class A {
public static void main(String[] ar) {
FileInputStream fis = new FileInputStream("text.txt");
}
}
5) CloneNotSupportedException
- clone() 메서드
-> Object 클래스의 메서드
-> 자신의 객체를 복사한 클론 객체를 생성해 리턴하는 메서드
-> 복사의 대상이 되는 클래스는 반드시 Cloneable 인터페이스를 상속해야 함
- Cloneable 인터페이스를 상속하지 않은 클래스의 객체를 복사하기 위해 clone()메서드를 호출하면 CloneNotSupportedException 발생
class B {
@override
// A 클래스의 내부에서 clone() 메서드를 호출하기 위해
// B 클래스에서 clone()메서드를 오버라이딩
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class A {
public static void main(String[] ar) {
B b1 = new B();
B b1 = (B)b1.clone();
//class B가 Clonalbe 인터페이스를 구현하지 않으면
//CloneNotSupportedException 발생
}
}
4. 실행 예외
- 실행 예외를 처리하는 클래스는 Exception의 자식 클래스인 Runtime Exception 클래스의 자식 클래스
- 실행 에외는 예외 처리를 하지 않아도 문법 오류가 발생하지 않지만, 실행 중인 프로그램이 강제 종료되는 주요 원인이 됨
1) ArithmeticException
- 연산 자체가 불가능할 때 발생하는 실행 예외
public class A {
public static void main(String[] ar) {
System.out.println(3/0); //연산 불가(분모 0)로 ArithmeticException 발생
}
}
2) ClassCastException
- 상속관계에 있는 클래스 간의 업캐스팅은 항상 가능하지만, 다운캐스팅은 가능할 수도, 불가능 할 수도 있음
- 다운캐스팅이 불가능한 상황에서 다운캐스팅을 시도할 때 발생
class A{}
class B extends A{}
public class Test {
public static void main(string[] ar) {
A a = new A();
B b = (B)a; //Class 캐스팅이 불가능해 ClassCastException 발생
}
}
3) ArrrayIndexOutOfBoundsException
- 배열의 인덱스를 잘못 사용했을 때 발생
- 배열의 인덱스는 항상 0 ~ (배열의 길이 -1)까지의 값만 사용 가능
- 범위 밖에 있는 인덱스를 사용하면 이 예외 발생
public class A {
public static void main(String[] ar) {
int[] a = {1,2,3};
Sysetem.out.println(a[3]);
//인덱스의 범위를 넘어섰을 때 ArrayIndexOutOfBoundsException 발생
}
}
4) NumberFormatException
- Integer.parseInt("문자열")
-> 문자열을 정숫값으로 변환
- Double.parseDouble("문자열")
-> 문자열을 실숫값으로 변환
- 문자열을 숫자 또는 실수로 변환할 때 문자열이 변환하고자 하는 숫자 형식이 아니면 변환이 실패
- 이떄 발생하는 실행 예외 NumberFormatException
public class A {
public static void main(String[] ar) {
int num = Integer.parseInt("10!");
//Number(숫자)가 아닌 것을 숫자로 바꿀 때 NumberFormatException 발생
}
}
5) NullPointerException
- 참조 변수가 실제 객체를 가리키고 있지 않은 상황에서 필드나 메서드를 호출할 때 발생
- null은 위칫값을 저장하는 참조 변수의 초깃값으로만 사용 가능, 현재 가리키고 있는 객체가 없다는 것을 의미
- 객체를 가리키고 있지도 않은데 해당 위치에 가서 객체 안에 있는 멤버를 실행하라고 명령하니 수행할 수 없는 것
public class A {
public static void main(String[] ar) {
String a = null;
System.out.println(a.charAt(2));
//객체를 생성하지 않고 멤버를 사용할 때 NullPointerException 발생
}
}
'Java' 카테고리의 다른 글
14 - 3장 예외 전가 (0) | 2023.06.13 |
---|---|
14 - 2장 예외 처리 (0) | 2023.06.13 |
13 - 3 장 이너 인터페이스 (0) | 2023.06.05 |
13 - 2 장 익명 이너 클래스 (0) | 2023.06.05 |
13 -1 장 이너 클래스 (0) | 2023.06.04 |