본문 바로가기
Java

[JAVA] 오류 종류 정리 및 런타임 예외클래스 예제

by teamnova 2023. 2. 25.

프로그래밍의 오류 종류는 오류가 발생하는 시점에 따라 크게 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();
}

자주 나타나는 에러는 숙지해 두면 빠르게 원인을 찾아내는데 도움이 될것 같습니다.