8. exception 예외클래스 5개이상 조사하고 정리
예외 3개이상 발생시키고 try-catch 문장 작성하기.
예외와 오류
에러 : 대부분 문법오류, 컴파일 오류. ... 컴파일 시 발견된다.
예외(exception): 런타임에러, 실행중 에러. 컴파일은 통과하나 실행 도중 오류 발생.컴파일은 통과하지만 실행 도중에 오류가 발생함. 예외발생시 프로그램은 종료되나, 예외 잡아 처리과정하면 정상실행상태 돌아가기가능.
예외발생 -> 자바플랫폼이 인지 ->응용프로그램에 전달하여 처리하도록 유도.
자바의 exception 클래스/서브클래스 사용하여 해결!
- 일반 예외 (컴파일체크,) : 반드시 작성해야한다. 예외처리 코드가 없으면 컴파일 오류가 발생하기때문
- 실행 예외(Runtime Exception) 예외처리 코드를 생략하더라도 컴파일이 됨. 모든경우 예측불가하므로, 경험따라 코드 작성 요함
- NullPointerException 객체 참조가 없는상태
- null값 갖는 참조변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생한다.
- ArrayIndexOutOfBoundsException 배열에서 인덱스 범위 초과하여 사용할 경우 발생
- ClassCastException 올바르지 않은 캐스팅을 사용할경우
- NullPointerException 객체 참조가 없는상태
예외클래스 Try-Throw-Catch-Finally
Exception클래스의 생성자(2)
- Exception(Srting s) : 메시지로 Exception 객체를 생성
- Exception() : "널(NULL)문자열" 로 Exception객체를 생성
- 발생한 Exception 정보를 알아오는 메소드 : String getMessage() << 객체에 저장된 문자열/널(null)을 반환
Exception계층
Object
Throwable
- Exception
- Error
- RuntimeException
- 기타예외들... (실행예외들) 아래는 예외 클래스 조사
- ArithmeticException : 산술 연산에서 오류가 발생했을 때
(0으로 나누기 등) - NullPointerException : null 값을 참조하려고 할 때.
String s = null; s.length(); → null인 객체를 사용하려 할 때 - IndexOutOfBoundsException : 배열이나 리스트 등의 인덱스가 범위를 벗어났을 때.
int[] arr = new int[3]; arr[5] = 10; - ClassNotFoundException : 클래스 로더가 해당 이름의 클래스를 찾지 못했을 때 (주로 리플렉션 등에서).
Class.forName("com.unknown.ClassName"); - IOException : 입출력 작업 중 발생하는 일반적인 예외의 상위 클래스.
파일을 읽거나 쓸 때 오류가 발생하면 IOException이 던져짐 - FileNotFoundException : 정한 파일이 존재하지 않을 때 (IOException의 하위 클래스).
FileReader reader = new FileReader("no-file.txt"); - EOFException(End of File Exception) : 입력 스트림에서 더 이상 읽을 수 없을 때 (끝에 도달했을 때)
ObjectInputStream으로 객체를 읽는 도중 EOF에 도달하면 발생 - IllegalArgumentException : 메서드에 부적절하거나 유효하지 않은 인수를 전달했을 때.
Thread.sleep(-1000); → 음수값은 허용되지 않음 - ArrayIndexOutOfBoundsException : 배열의 범위를 벗어난 접근 시 발생
- OutOfMemoryError : 메모리가 부족한경우 발생
- NumberFormatException : 문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환 시 발생
- InputMismatchException : Scanner클래스의 nextInt를 호출하여 정수를 입력받고자 하였으나, 사용자가 'a' 등과 같이 문자를 입력한경우.
- RuntimeException
예외 발생 시 :
- 전달(throw) : 호출된 곳으로 전달한다(돌린다)
- 잡기(catch) : 발생한 위치에서 직접 잡는다
예외처리코드
try - (throw) - catch - finally 블록을 이용해 예외처리코드를 작성한다.
- try : 예상되는 문제가 있을것같은 코드를 try 블록으로 설정
- catch : Exception객체가 전달될 때(throw), 제어가 해당 catch블록으로 이동.
캐치 블록은 예외별로 여러개 존재가능. 최상위 예외는 가장 마지막에 위치시킨다. - finally 블록: 예외 발생과 전달throw 여부에 관계없이 항상 실행되는 코드 블록. (생략가능), 마무리하는역할
의미있는 값을 전달하도록 하지 않는다.
Throws : 직접 잡아 처리하는 catch()와 달리, 예외를 호출한 곳으로 전달만 한다. 예외를 떠넘기기라고도 함.
FileNotFoundException이 Exception과 IOException의 하위클래스이기 때문에(is-a) 하단의 상위클래스로 대체되어 사용될수 있다.
- catch(FileNotFoundException e) :아래 두개보다 더 많은 정보를 제공해줌.
- catch(IOException e)
- catch(Exception e)
즉, 예외를 전달할 때에는 최대한 구체적으로 전달하는 것이 좋다.
예외 종류에 따른 처리 코드
사용자 정의 예외 클래스 선언 : 자바 표준 API에서 제공하지 않는 얘외는 개발자가 만들어 사용 가능 like 애플리케이션 서비스
방법: Exception클래스(일반예외, 컴파일예외)나 RuntimeException(실행예외) 클래스를 상속한다!
public class XXXException extends[ Exception| RuntimeException] {
public XXXException(){}
public XXXException(String message){
super(message);
}
}
코드에서 예외를 발생시키고 잡거나 던진다.
예외 정보 얻기
getMessage() : 예외를 발생시킬 때 생성자 매개값으로 메시지를 리턴
전달된 메시지는 catch에서 활용.
printStackTrace() : 예외발생코드를 추적한 내용을 모두 콘솔에 출력 프로그램을 테스트하면서 오류를 찾을 때 유용하게 활용.
정리: 예외처리의 구조
try{
//모든 조건을 if then else로 체크하기 어렵거나, 문제가 발생할 수 있는 의심스러운 코드
}catch{
//처리코드
}catch{
//처리코드
}
...
}catch(Exception e){
// catch코드의 마지막에는 가장 추상적인 클래스인 Exception을 써줌
}finally{
//예외 발생여부 관련없이 공통실행. 처리해야하는 마무리코드
}
코드 // 정상적으로예외처리 시 실행되는것
'컴퓨터공학과 > Java 1 & 2' 카테고리의 다른 글
| Battle 과제 코드 수정 - 공격/힐링 모듈화 + 레벨업 모듈화 (0) | 2025.05.30 |
|---|---|
| Generic&Collection, Summary (0) | 2025.05.30 |
| [문제해결] 이클립스 패키지탐색기에서 파일이 열리는 경우 (0) | 2025.05.17 |
| JAVA 프로그래밍 및 실습 I - [과제#6] String클래스 조사 및 사용하기(Summary포함) (0) | 2025.05.17 |
| chap06-Inheritance-interface (0) | 2025.05.10 |