프로그램 오류 (== 프로그램 에러)
프로그램 수행 시 치명적 상황이 발생하여 비정상 종료 상황이 발생한 것
오류의 종류
1. 컴파일 에러 : 프로그램의 실행을 막는 소스 상의 문법 에러 => 소스 구문을 수정하여 해결
2. 런타임 에러 : 프로그램 실행 중에 발생하는 에러 (입력 값이 틀렸거나, 배열의 인덱스 범위를 벗어났거나, 계산식의 오류 등) => 주로 if문 사용으로 에러 처리
3. 시스템 에러 : 컴퓨터 오작동으로 인한 에러 => 소스 구문으로 해결 불가
4. 논리 에러 : 컴파일, 런타임 모두 문제없지만 프로그램 의도상 맞지 않는 것
컴파일 에러, 런타임 에러, 논리 에러와 같은 소스 수정으로 해결 가능한 에러를 예외(Exception)라고 하는데
이러한 예외 상황(예측 가능한 에러) 구문을 처리하는 방법을 예외처리라고 한다
예외 클래스 계층 구조
Exception과 Error 클래스 모두 Object 클래스의 자손이며 모든 예외의 최고 조상은 Exception 클래스
반드시 예외 처리해야 하는 Checked Exception과 해주지 않아도 되는 Unchecked Exception으로 나뉨
RuntimeException 클래스
Unchecked Exception으로 주로 프로그래머의 부주의로 인한 오류인 경우가 많기 때문에
예외 처리보다는 코드를 수정해야 하는 경우가 많음
- RuntimeException 후손 클래스
> ArithmeticException
나누기 연산 시 0으로 나누는 경우 발생되는 예외
* if문으로 나누는 수가 0인지 검사
public void method1() {
System.out.print("첫번째 정수 : ");
int num1 = sc.nextInt();
System.out.print("두번째 정수 : ");
int num2 = sc.nextInt();
try {
int result = num1 / num2;
System.out.println("result : " + result);
} catch (ArithmeticException e) { // 예외를 낚아챔
System.out.println("0으로 나눌 수 없습니다.");
e.printStackTrace(); // 강제로 오류난 이력 보고자 할 때 실행하는 구문
}
System.out.println("프로그램을 종료합니다.");
}
> NullPoicterException
참조 변수가 null로 초기화된 상황에서 null에 접근했을 시 발생되는 예외
* 객체 사용 전에 참조 변수가 null인지 확인
> NegativeArraySizeException
배열 할당 과정에서 배열 크기를 음수로 지정한 경우 발생되는 예외
* 배열 크기를 0보다 크게 지정해야 함
> ArrayIndexOutOfBoundsException
배열의 index 범위를 넘어서 참조하는 경우 발생되는 예외
* 배열명.length를 사용하여 배열의 범위 확인
public void method2() {
System.out.print("배열의 크기 : ");
int size = sc.nextInt();
try {
int[] arr = new int[size]; // 음수 입력, 100번 인덱스를 구할때
System.out.println("100번 인덱스의 값 : " + arr[100]);
} catch (NegativeArraySizeException e) {
System.out.println("배열의 크기로 음수를 제시할 수 없습니다.");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("부적절한 인덱스로 접근했습니다.");
} // 다중 catch 블럭 작성 가능
System.out.println("프로그램을 종료합니다.");
}
> ArrayIndexOutOfBoundsException
배열의 index 범위를 넘어서 참조하는 경우 발생되는 예외
* 배열명.length를 사용하여 배열의 범위 확인
> ClassCastException
허용할 수 없는 형변환이 진행될 때 발생되는 예외
* instanceof 연산자로 객체 타입 확인 후 형변환
- Exception 확인하기
Java API Document에서 해당 클래스에 대한 생성자나 메소드를 검색하면
그 메소드가 어떤 Exception을 발생시킬 가능성이 있는지 확인 가능
해당 메소드를 사용하려면 반드시 뒤에 명시된 예외 클래스를 처리해야 함
- 예외처리 방법
1. Exception이 발생한 곳에서 직접 처리
- try~catch문을 이용하여 예외처리
try {
// 예외가 발생할 가능성이 있는 코드를 안에 기술
} catch () {
// try 구문에서 예외 발생 시 해당하는 예외에 대한 처리 기술
// 여러 개의 예외 처리가 가능하나 예외 간의 상속 관계 고려
} finally {
// 예외 발생 여부와 관계없이 꼭 처리해야 하는 로직 기술
// 중간에 return문을 만나도 finally 구문은 실행되지만
// System.exit(); 를 만나면 무조건 프로그램 종료
// 주로 java.io나 java.sql 패키지의 메소드 처리 시 이용
}
- try~catch로 예외 잡기 예시
* 다중 catch 블럭 작성 가능
public void method() {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("c:/data/text.txt"));
String s;
while((s = br.readLine()) != null) {
System.out.printls(s);
}
} catch(FileNotFoundException e) {
} catch(IOException e) {
} finally {
try {
if(br != null) br.close();
} catch(IOException e) {}
}
}
- try~with~resource
자바7에서 추가된 기능으로 finally에서 작성했던 close 처리를 try문에서 자동 close 처리
try (BufferedReader br = new BufferedReader(new FileReader("c:/data/text.txt"))) {
String s;
while((s = br.readLine() != null) {
System.out.println(s);
}
} catch(FileNotFoundException e) {
System.out.println("파일이 없습니다");
} catch(IOException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}
2. Exception 처리를 호출한 메소드에게 위임
메소드 선언 시 throws ExceptionName문을 추가하여 호출한 상위 메소드에게 처리 위임
계속 위임하면 main() 메소드까지 위임하게 되고 거기서도 처리되지 않는 경우 비정상 종료
- throws를 이용(떠넘기기 == 위임하기)
지금 예외처리를 하지 않고 이 메소드를 호출하는 곳으로 예외처리 떠넘기겠다
import java.io.IOException;
public class ThrowsTest {
public static void main(String[] args) {
ThrowsTest tt = new ThrowsTest();
try {
tt.methodA();
} catch (IOException e) {
e.printStackTrace();
} finally {
System.out.println("프로그램 종료");
}
}
public void methodA() throws IOException {
methodB();
}
public void methodB() throws IOException {
methodC();
}
public void methodC() throws IOException {
throw new IOException();
// Exception 발생
}
}
'Study' 카테고리의 다른 글
[JAVA/자바] 컬렉션 (Collection) (1) | 2022.12.05 |
---|---|
[JAVA/자바] 입출력 (IO) (0) | 2022.11.28 |
[JAVA/자바] 추상클래스 (abstract class) & 인터페이스 (interface) (0) | 2022.11.16 |
[JAVA/자바] 다형성 (Polymorphism) (0) | 2022.11.15 |
[JAVA/자바] 클래스 (class) - 필드 / 생성자 / 메소드 (0) | 2022.11.10 |