춘식이왔엉 2022. 7. 2. 20:56

프로그램 오류

 

* 컴파일 에러 ( compile-time error )

- 컴파일 할 때 발생하는 에러

 

* 런타임 에러 ( runtime error ) 

- 실행할 때 발생하는 에러 

 

* 논리적 에러( logical error )

- 작성 의도와 다르게 동작

 

< 자바 컴파일러 javac.exe 의 기능 >

1. 구문체크

2. 번역

3. 최적화

 

< Java의 런타임 에러 >

1. 에러 : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류 ( Out of Memory Error )

2. 예외 ( exception ) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

--> 에러는 어쩔 수 없지만, 예외는 처리하자.

* 예외처리의 정의와 목적

1. 정의 : 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것

2. 목적 : 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것

 

 

* Exception과 RuntimeException

1. Exception클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외

* checked예외 - 컴파일러가 예외 처리 여부를 체크 (예외 처리 필수)

- IOException 입출력 예외

- ClassNotFoundException 클래스가 존재X

2. RuntimeException클래스들 : 프로그래머의 실수로 발생하는 예외

* unchecked예외 - 컴파일러가 예외 처리 여부를 체크 안함 (예외 처리 선택)

- ArithmeticException 산술계산예외

- ClassCastException 형변환

-NullPointerException 널..

- IndexOutOfBoundsException 배열 범위 벗어남

 

< 예외 처리하기 >

* try-catch문

- try블럭 내에서 예외가 발생한 경우

1. 발생한 예외와 일치하는  catch블럭이 있는지 확인

2. 일치하는 catch블럭을 찾게 되면, 그 catch블럭 내의  문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch블럭을 찾지 못하면, 예외는 처리되지 못함

- try블럭 내에서 예외가 발생하지 않은 경우

catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속함

 

* 예외의 발생과 catch블럭

- 예외가 발생하면, 이를 처리할 catch블럭을 찾아 내려감

- 일치하는 catch블럭이 없으면, 예외는 처리 안됨

-  Exception이 선언된 catch블럭은 모든 예외 처리

 

* printStackTrace()와 getMessage()

printStackTrace() - 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력

getMessage() - 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있음

 

* 멀티 catch블럭

- 내용이 같은 catch블럭을 하나로 합친 것

- 부모자식관계는 X /  공통멤버만 참조변수로 사용 가능

try {...
} catch (ExceptionA e) {
    e.printStackTrace();
} catch (Exception e2) {
    e2.printStackTrace();
}
// 합치기
try {...
} catch (ExceptionA | exceptionB e) {
    e.printStackTrace();
}

 

 

< 예외 발생시키기 >

1. 연산자 new를 이용해서 발생시키려는 예외 클래스 객체를 만든 다음

2. 키워드 throw를 이용해서 예외를 발생시킴

 

< 메서드에 예외 선언하기 >

- 예외를 처리하는 방법 : try-catch문 (직접처리) / 예외 선언하기 (예외 떠넘기기) / 은폐

- 메서드가 호출시 발생가능한 예외를 호출하는 쪽에 알리는 것