본문 바로가기

Java

14 - 1장 예외

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