예외 클래스
에러(error) : 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것
예외(exception) :
- 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류
- 예외가 발생하면 프로그램이 곧바로 종료된다는 점에서 에러와 비슷
- 그러나 예외 처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지된다는 점에서 에러와 차이가 있다.
예외 클래스 : 자바에서는 예외를 클래스로 관린한다. 모든 예외 클래스는 java.lang.Exception 클래스를 상속받는다.
< 예외의 두가지 종류 >
① 일반 예외 (exception) : 컴파일러 체크 예외. 자바 소스를 컴파일하는 과정에서 해당 예외 처리 코드가 있는지 검사한다. 만약 예외 처리 코드가 없다면 컴파일 오류가 발생함
② 실행 예외 (runtime exception) : 컴파일러 넌체크 예외. 실행 시 예측할 수 없이 갑자기 발생. 따라서 컴파일하는 과정에서 예외 처리 코드가 있는지 검사하지 않는다.
실행 예외
- 오로지 개발자의 경험에 의해서 예외처리 코드를 작성해야 한다.
- 프로그램에서 예외가 발생하면 예외 메시지가 콘솔뷰에 출력된다.
- 콘솔뷰에서는 어떤 예외가 어떤 소스의 몇 번째 코드에서 발생했는지 알 수 있다.
① NullPointerException : 객체 참조가 없는 상태
예를 들어, String s = null; 인데 s.toString() 메소드를 호출하는 경우
② ArrayIndexOutOfBoundsException : 배열에서 인덱스 범위를 초과할 경우 발생.
예를 들어, int[ ] arr = new int [3] 배열에 arr[3] 의 값을 넣으려고 하는 경우
③ NumberFormatException : 숫자로 변환될 수 없는 문자를 숫자로 변환하려 할 때 발생
- String to int : Integer.parseInt(String s)
- String to double : Double.parseDouble(String s)
예를 들어, String s = "a100"; 이라는 문자열을 숫자로 변환하려고 하는 경우
④ ClassCastException : 상위 클래스와 하위 클래스간 타입 변환시 발생하는 오류. 타입 변환 전에 변환이 가능한지 instanceof 연산자로 확인하는 것 이 좋다.
Animal animal = new Dog();
Dog dog = (Dog) animal;
- 위와 같은 경우 Animal 타입 변수에 대입된 객체가 Dog이므로 다시 Dog로 변환하는 것은 아무런 문제가 없다.
- 그러나 다시 Cat 클래스로 타입변환을 한 경우 대입된 객체가 아닌 다른 클래스 타입으로 변환되었기 때문에 예외가 발생한다.
예외 처리 코드
예외 처리 : 프로그램에서 예외가 발생했을 경우 프로그램의 갑작스러운 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 것
① try - catch - finally 블록 : 생성자 내부와 메소드 내부에서 작성되어 일반 예외와 실행 예외가 발생할 경우 예외 처리를 할 수 있도록 해준다.
- try 블록에 예외 발생 가능 코드가 위치한다.
- try 블록의 코드가 정상 실행 된다면 바로 finally 블록의 코드를 실행하고, 만약 예외가 발생한다면 바로 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드를 실행한다. 그리고 finally 블록의 코드를 실행한다.
- finally블록은 생략 가능하다. 예외 발생 여부와 관계없이 항상 실행할 내용이 있을 경우에만 작성해주면 된다.
② 다중 catch 블록
- try 블록 안에 다양한 예외가 발생할 수 있다.
- try 블록에서 특정 타입의 예외가 발생하면 catch 블록에서도 그 타입에 맞는 예외 처리가 실행된다.
- try 블록에서 예외가 발생했을 때, 예외를 처리해 줄 catch블록은 위에서부터 차례대로 검색된다.
- 따라서, catch 블록이 여러 개라 할지라도 해당되는 단 하나의 catch 블록만 실행된다.
- 주의할 점은, 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 한다는 것 (아래 사진 참조)
- 위의 왼쪽 사진에서 ArrayIndexOutBoundsException은 Exception을 상속받기 때문에 첫 번째 catch 블록만 선택되어 실행이 된다. 따라서 두 번째 catch 블록은 어떤 경우라도 실행되지 않는 문제가 있다. 올바르게 사용한 예시는 오른쪽이라고 할 수 있다.
③ 예외 떠넘기기 - throws
- 메소드 내부에서 예외 처리를 할 때 try - catch 블록으로 처리하는 것이 기본이지만,
- 경우에 따라 메소드를 호출한 곳으로 예외를 떠넘길 수도 있다.
- throws 키워드는 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 한다.
- 그러면 메소드를 호출하는 곳에서 try-catch 블록을 사용해 예외 처리를 해줘야 한다.
- main()메소드에선 throws Exception을 사용하는 것이 바람직하지 않기 때문에, try-catch 예외를 최종 처리해주는 것이 좋다.
예외 떠넘기기 참고 블로그 :
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=heartflow89&logNo=220985722731
'Coding > Java' 카테고리의 다른 글
[14] JAVA Math 클래스 메소드 (0) | 2022.11.23 |
---|---|
[13] JAVA String 클래스 메소드 정리 (0) | 2022.11.23 |
[11] JAVA String, StringBuilder 클래스 (0) | 2022.11.22 |
[10] JAVA - 필드(Field) (0) | 2022.11.22 |
[09] Java 클래스 - 객체 지향 프로그래밍 (2) | 2022.11.22 |