반응형

프로그램 오류

[프로그램 오류의 종류]

  • 컴파일 에러(cmpile-time error) : 컴파일 할 때 발생하는 에러
  • 런타임 에러(runtime error) : 실행 할 때 발생하는 에러
  • 논리적 에러(logical error) : 작성 의도와 다르게 동작

컴파일 에러는 정확히 이야기하면, 컴파일 타임에러다. 즉, 컴파일 할 때 발생하는 에러이다.

System.out.println 이라고 작성해야 하는데 대문자 S를 소문자s로 작성했더니, system을 해석할 수 없다는 컴파일 에러가 발생한다.

원래는 javac.exe가 자바 컴파일러라서 이 명령어를 사용해서 컴파일 해야하는데, 
인텔리제이가 자동으로 컴파일을 해준다.

커맨드창에서 직접 컴파일을 해볼까?

ExceptionTest.java파일이 있는 src경로로 이동한다음,

javac ExceptionTest.java 명령을 이용해서 컴파일을 했더니, 4번째 줄에 1개의 에러가 있다고 나온다.

이렇게 원래는 일일이 해줘야 하는데, 인텔리제이가 자동으로 컴파일을 해주는 것이다. 

아무튼, 이러한 에러가 컴파일 에러다.

이 에러를 고쳐보자.

소문자s를 대문자 S로 수정했다. 빨간줄이 없어진 것을 확인할 수 있다.

컴파일 했을 때 에러가 발생하지 않는다.

 

컴파일러가 하는일

  • 구문체크(문법)
  • 번역
  • 최적화
  • 생략된 코드 추가

 

이번에는 컴파일 에러를 수정한 코드를 실행시켜보자.

실행을 했더니, 에러가 발생한다.
실행 중, 발생한 에러가 런타임 에러다.

컴파일러가 구문체크를 했을 때, 문법에는 맞지만,
해당 코드를 실제로 JVM이 코드를 실행하다보면 문제가  발생할 수 있는데, 이것이 런타임 에러다.

컴파일 타임에서는 기본적인 것만 체크를 하는 것이지, 전부를 체크할 수 는 없다.

즉, 컴파일 했을 때, 문제가 없었다고 해서 실행해 문제가 없는 것이 아니다.

실행 중에는, 굉장히 복잡한 일들이 일어나기 때문에, 우리가 예상 할 수 없는 많은 일들이 일어나고,
그때 발생하는 에러를 런타임 에러라고 한다.

위의 코드에서는 런타임 에러가 왜 발생하냐면,
(String[] args)에 매개변수로 넘어온 값이 없는데, 
그것을 사용하려고 해서 에러가 발생하는 것이다. 

터미널에서 실행해 보면, 런타임 에러가 발생했다.

ExceptionTest.java의 6번쨰 줄에서, ArrayIndexOutOfBoundsException이 발생한 것이다.

 


다시 정리하자면,  프로그램에서 발생할 수 있는 오류의 종류는 크게 3가지가 있다.

  • 컴파일 에러(cmpile-time error) : 컴파일 할 때 발생하는 에러
  • 런타임 에러(runtime error) : 실행 할 때 발생하는 에러
  • 논리적 에러(logical error) : 작성 의도와 다르게 동작

 

컴파일 에러는, 컴파일 할 때 발생하는 에러고,

런타임 에러는 실행 할 때 발생하는 에러다.

그리고, 마지막으로 논리적 에러가 있는데, 
컴파일에서도 에러가 발생하지 않았고, 실행할 때도 에러가 발생하지 않았지만, 
내가 원하던 것과(작성 의도와)다르게 동작하는 것을 논리적 에러라고 말한다.

 

컴파일에러는 수정하기 전까지는, 클래스파일이 만들어 지지않아서 실행할 수 없다.
런타임 에러는 실행은 되지만, 실행하다가 에러가 발생해서 프로그램이 죽는다.

그런데, 논리적 에러는 프로그램이 종료되지 않는다.
잘 동작은 하는데, 내가 원하는대로 동작하지 않는 것이다.

 

 

Java의 런타임 에러

자바에서는 런타임 에러를 2가지로 분류해놓았다.

코드에 의해 수습될 수 없는 심각한 오류를 에러라고 정의했고,

프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류를 예외라고 정의했다.

 

Out of Memory Error(OOME)라는 에러는 메모리가 부족해서 죽는 에러인데, 너무 심각한 에러이기 떄문에 이런것들은 에러이다.

그러나 심각한 것들 말고, 간단히 우리가 처리할 수 있는 것은 예외(exception)으로 처리해서,
프로그램이 죽지않고 문제없이 돌아갈 수 있게 하는 것이 예외처리이다.

 

다시한번 정리하면, 
자바에서 발생할 수 있는 런타임 에러, 즉 실행중에 발생할 수 있는 에러의 종류는, 에러(error)와 예외(exception) 2가지이다.

심각한 것은 에러(error)이고, 덜 심각한 것은 예외(exception)이다.

 

우리가 예외처리를 하는 이유는, 
프로그램의 비정상 종료를 막기 위해서 이다.

그래서, 예외처리의 정의는,
프로그램 실행 시 발생할 수 있는 미약한 오류, 즉 예외의 발생을 대비한 코드를 작성하는 것이다.

 


 

예외 클래스의 계층 구조

 

이 그림은, 상속계층도인데, 
최고조상인 Object가 있다.

그리고 그 아래에 Throwable이 있는데, 이것은 너무 신경쓰지 말자.

예외는 크게 Exception과 error로 나눈다.

Exception은 미약한 오류, Error는 심각한 오류 이고, 둘다 런타임에러다.

 

Error, 즉, 심각한 오류중에, OutOfMemoryError는 메모리가 필요한데 더이상 사용할 수 있는 메모리가 없어서 죽는 것이다. 이것은 죽는 것을 막을 수가 없다.

Exception쪽을 보면(우리가 처리할 수 있는 미약한 오류),
심각하지 않은 오류들을 Exception클래스의 자손으로 해놓았다. 

 

밑의 그림은 Exception과 그 자손들을 따로 떼어서 그린 것이다. 

Exception의 자손들도 2부분으로 나눌 수 있는데, 

하나는, Exception클래스와 그 자손들, 
두번째는, RuntimeException과 그 자손들이다.

사실, 모든 예외는 Exception의 자손이다.
즉, RuntimeException도 Exception의 자손이다.

그런데, RuntimeException의 자손인것과 아닌것으로 나눈 것이다.

 


 

Exception과 RuntimeException

 

Exception클래스와 그 자손들을 간단히 Exception클래스들이라고 표시했다. 
그리고, RumtimeException클래스와 그 자손들은 간단히 RuntimeException클래스들 이라고 표시했다.
예외를 둘로 나눈 것인데(Exception클래스와 그 자손들이라고 적기에 불편해서 Exception클래스들 이라고 적은 것임),

  • Exception클래스들 - 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
  • RuntimeException클래스들 - 프로그래머의 실수로 발생하는 예외

 

Exception클래스들은, 사용자의 실수라던가, 특정 파일이 없다던가하는 외적인 요인에 의해서 발생하는 예외를 정의해 놓은 것이고,


RuntimeException클래스들은, 프로그래머 실수로 발생하는 예외들을 정의해 놓은 것이다. 

 

그래서 Exception자손들을 보면,  (외적인 요인에 의해 발생하는 예외)

  • IOException 입출력예외는 입력, 출력(I/O) 가 있는데, 외부 기기로부터 값을 읽거나, 외부 기기에 값을 보낼 때 발생하는 에러다.
  • ClassNotFoundException은 클래스를 못찾는 것이다. (클래스 존재 X) 클래스파일을 찾지 못하는 것. 

 

그리고 RuntimeException같은 경우에는, (프로그래머의 실수에 의해 발생)

  • ArithmeticException은 계산할 때, 산술계산 예외이다.  예를 들어 5나누기0을 하면 발생한다. 정수는 0으로 나누면 안된다.
  • ClassCastException은 형변환을 잘못하면 발생한다.
  • NuillPointerException은 예를 들어 어떤 str객체가 nulldlsep, str.length()를 호출하면 발생한다. 가리킨 객체가 Null일때 발생.
  • IndexOutOfBoundsException은 배열의 범위를 벗어나면 발생한다.
반응형

'JAVA' 카테고리의 다른 글

printStackTrace(), 멀티 catch블럭  (0) 2022.04.11
예외 처리하기, try-catch문의 흐름  (0) 2022.04.10
익명 클래스  (0) 2022.04.08
내부 클래스의 제어자와 접근성  (0) 2022.04.08
내부 클래스의 종류, 특징, 선언  (0) 2022.04.07