프로그래밍의 오류 종류는 오류가 발생하는 시점에 따라 크게 3가지로 나뉠 수 있습니다.
- 컴파일 오류 : 잘못된 구문이나 문법적 오류로 오류 메시지를 출력하거나 애플리케이션 실행을 멈추는 오류(이름 그대로 컴파일 시 발생하는 오류)
- 런타임 오류 : 컴파일 시에는 없는데 실행 중에 발생하는 오류
- 논리 오류 : 정확한 로직이 아닌 오류 (실행은 되지만 의도와 다르게 동작하는것)
논리 오류
이른바 ‘버그’ 라고 생각할 수 있습니다.
프로그램이 실행하고 작동하는데는 아무 문제가 없지만 결과가 예상과 달라 사용자가 의도한대로 작동하지않는 오류로 써 서비스 이용에 지장이 생길 수 있습니다.
ex) 게임의 경우 바닥이나 벽을 뚫고 지나가는 유저라던가.. 재고를 관리하는 서비스에서 음수가 나온다던가… 하는 경우를 예로 들 수 있음
컴파일 오류
컴파일 단계에서 오류를 발견하면 컴파일러가 에러메시지를 출력해 줍니다.
대부분의 경우 문법 구문오류(syntax error)로 발생합니다.
맞춤법이나 문장부호 , 선언되지 않은 변수 등을 사용하면 빨간줄로 잘못되었다고 컴파일 에러를 알려주는것이 바로 이것입니다.
IDE 에서는 일정주기로 계속 자동으로 컴파일을 해주기 때문에 바로바로 문제를 확인할 수 있는것입니다.
런타임 오류
런타임 즉 프로그램이 실행하는 도중에 에러가 발생해서 잘못된 결과를 얻거나, 혹은 외부적인 요인으로 프로그램이 비정상적으로 작동할때 발생하는 오류입니다.
이 런타임 오류 안에서도 설계 미숙으로 인한 논리적 오류로 발생하는 에러가 대부분이며
이경우 프로그래머가 역추적해서 원인을 확인해야 합니다.
이런 런타임 에러를 방지하기 위해 프로그램 실행 도중 발생할 수 있는 경우의 수를 고려하여 이에 대한 대비를 해야합니다.
이에 대한 대응코드가 바로 자바의 예외 처리 문법인 (try - catch) 인것입니다.
예외클래스
예외 클래스의 계층구조를 먼저 살펴봅시다.
Error 클래스는 외부적 요인으로 인해 발생하는 오류이기에 개발자가 대처할 수는 없습니다.
따라서 우리는 Exception 클래스를 중점적으로 볼 예정입니다.
Exeption 클래스는 다시 RuntimeExeption 과 그외의 자식 클래스 그룹으로 나뉘게 됩니다.
Exception 및 하위클래스 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 컴파일시 발생하는 예외
- 존재하지않는 파일의 이름을 입력(FileNotFoundException)
- 실수로 클래스의 이름을 잘못 기재(ClassNotFoundException)
- 입력한 데이터 형식이 잘못된 경우(DataFormatException)
RuntimeException 클래스 : 프로그래머의 실수로 발생하는 예외
- 배열의 범위를 벗어남(IndexOutOfBoundsException)
- 값이 null 인 참조 변수의 멤버를 호출(NullPointerException)
- 클래스 간의 형 변환을 잘못함(ClassCastException)
- 정수를 0으로 나누는 산술 오류(ArithmeticException)
런타임 예외 클래스 예제
자주 보게될 몇가지 실행예외클래스에 대한 예제를 몇가지 정리하며 마무리 하겠습니다.
ArrayIndexOutOfBoundsException
• 배열의 범위를 넘어선 인덱스를 참조할 때 발생하는 에러
public class RuntimeErrorsExample {
public static void main(String[]args) {
intary[] = {3, 2, 6}; // 배열 길이 = 0,1,2
System.out.println("Result: " +ary[3]);// 조회하는 배열 범위 밖을 조회
}
}
ArithmeticException
• 정수를 0으로 나눌 때 발생하는 에러
public static void main(String[]args) {
System.out.println(10/0);
}
NullPointException
• null 객체에 접근해서 method를 호출하는 경우 발생하는 에러 (객체가 없는 상태에서 객체를 사용하려 했으니)
public class NullpointException {
public static void main(String[]args) {
Stringa= null;// String a 값은 null
System.out.println(a.length());// null 인 String a 의 length 값을 호출
}
NumberFormatException
• 정수가 아닌 문자열을 정수로 변환할 때 예외 발생
StringstringNumber= "1.3425";
intnum= Integer.parseInt(stringNumber); // stringNumber 1.3425 를 정수로 변환할때 Exception 발생
//float num = Float.parseFloat(stringNumbrt); // 이와 같이 변환 가능한 형태로 변경해 주어야 함(이 경우 float)
ClassCastException
• 상속, 구현 관계 아니면 클래스는 다른 클래스로 타입을 변환할 수 없는데, 이 규칙을 무시하고 억지로 타입을 변환시킬경우 발생하는 에러
Objectx= 4;
System.out.println( (String)x); // 정수 객체를 스트링 객체로 캐스팅
InputMismatchException
• 의도치 않는 입력 오류 시 발생하는 예외
public static void main(String[]args) {
Scannerscanner= new Scanner(System.in);
System.out.println("정수 3개를 입력하세요");
intn=scanner.nextInt(); // 정수 입력 -> 사용자가 문자를 입력하면 예외 발생
scanner.close();
}
자주 나타나는 에러는 숙지해 두면 빠르게 원인을 찾아내는데 도움이 될것 같습니다.
'Java' 카테고리의 다른 글
[Java] awt 테트리스 - 기본편 (0) | 2023.06.03 |
---|---|
[Java] 자바 추상 클래스(Abstract Class) 예제 (0) | 2023.05.01 |
[JAVA]Calendar 사용해서 현재 요일, 지정 요일 가져오기 (0) | 2023.01.31 |
[JAVA] DateTimeFormatter을 사용해 날짜/시간 다루기 (0) | 2022.10.12 |
[java] 자바 스윙 화면 구성 (0) | 2022.07.29 |