IT수업/JAVA PART2

IT 수업 12주차 (35) 예외 처리

워제하 2024. 3. 13. 12:21

 

 

자바는 예외가 발생하면 프로그램을 중단하고 오류 메시지를 보여준다.

예외처리는 프로그램실행을 멈추지 않고 실행 할 수 있도록 하는 것 이다.

 

 

● 예외 메시지

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

- Runtime 에러 : 실행 할 때 발생하는 에러

- FileNotFoundException : 존재하지 않는 파일을 열려고 시도했기 때문에 원하는 파일을 찾을 수 없다

- ArithmeticException :  0으로 다른 숫자를 나눌 수 없으므로 산술 문제 

- ArrayIndexOutOfBoundsException : 배열에서 아무것도 없는 곳을 가리켰다

 

등등이 있다.

 

 

 

 

● 예외 처리하기

- try ~ catch 문

try 문 안의 수행할 문장 중에서 예외가 발생하지 않는다면 catch 문에 속한 문장들은 수행되지 않는다.

하지만 try 문 안의 문장을 수행하는 도중에 예외가 발생하면 예외에 해당되는 catch 문이 수행된다.

 

 

try {
    <수행할 문장 1>;
    <수행할 문장 2>;
    ...
} catch(예외1) {
    <수행할 문장 A>;
    ...
} catch(예외2) {
    <수행할 문장 a>;
    ...
}

 

 

 

 

- try ~ catch ~ finally 문

프로그램 수행 도중 예외가 발생하면 프로그램이 중지되거나 예외 처리에 의해 catch 구문이 실행된다. 
하지만 어떤 예외가 발생하더라도 반드시 실행되어야 하는 부분이 있어야 한다면 finally 문으로 처리가 가능하다.

 

try {

   예외 발생가능 코드

} catch (예외클래스 e) {

   예외처리

) finally {

    항상 실행;

}

 

 

 

 

 

- 멀티 catch 문

여러 catch 블럭을 '|' 기호를 통해 하나의 catch 블럭으로 합칠 수 있다.

catch문이 연달아 나열되는 중복된 코드를 줄일 수 있으며 연결할 수 있는 예외 클래스의 개수도 제한이 없다.

 

try {
    // ...
} catch (NullPointException | ArrayIndexOutOfBoundsExcetion e) {
    // ...
}

 

 

다만 멀티 catch는 결국은 위의 부모 예외 클래스 Exceptoin과 같이 여러 개의 예외를 통짜로 처리하는 것이기 때문에 각 예외마다 세세하게 제어하고 싶다면 if문instanceOf 연산자로 하나하나 분기하며 처리해야 한다.

try {
    // ...
} catch (NullPointException | ArrayIndexOutOfBoundsExcetion e) {
    if(e instanceOf NullPointException) {
     // ...
    } else if(e instanceOf ArrayIndexOutOfBoundsExcetion) {
     // ...
    }
}

 

 

 

 

● null 포인터 예외

 

 

< 실행화면 >

 

 

 

< 실행화면 >

HELLOWORLD가 찍히지 않는 것을 볼 수 있다.

 

 

 

여기서 try ~ catch 문을 사용하면 예외가 해결이 된다.

 

< 실행화면 >

 

catch()에서 괄호 안에는 발생한 예외메세지  e를 넣어주면 된다.

여기서는 NullPointerEXception 예외가 발생했기 때문에 NullPointerEXception e 를 넣어줬다.

 

 

 

 

- System.out.println(e.getCause()); 했을 시 결과 

 

.getCause()하면 원인에 대해 간략하게 표시된다.

 

 

 

- System.out.println(e.toString()); 했을 시 결과

 

 

 

- System.out.println(e.getStackTrace()); 했을 시 결과

 

 

 

- e.printStackTrace(); 는 흔히 보는 빨간색 오류인데 가급적으로 안쓰는게 좋다.

 

 

 

 

 

 

 

● 배열관련 인덱스 초과 예외

 

< 실행화면 >

 

 

 

- try ~ catch 문으로 예외 해결

 

< 실행화면 >

 

 

 

 

 

 

● 클래스 캐스트 예외

강아지에게 강아지를 넣었을 때는 오류가 발생하지 않는다.

 

< 실행화면 >

 

 

 

하지만 고양이를 강아지에게 넣었을 때는 오류가 발생한다.

 

< 실행화면 >

 

 

 

 

 

- try ~ catch 문으로 예외 해결

 

 

< 실행화면 >

 

 

 

 

 

 

● 예외 한번에 처리

 

먼저 여러 예외들을 적어준다.

 

 

그리고 try로 모든 예외를 묶어 처리해본다.

 

 

< 실행화면 >

 

그러면 null예외가 발생 되었다고 해서 null위치에 가서 catch문을 사용하면 또 다른 예외메시지가 출력되게 된다.

 

 

 

< 실행화면 >

 

 

 

그래서 해당 예외위치에 가서 또 catch 문을 써서 해결했더니 또 다른 예외가 발생했다고 순차적으로 뜨게된다.

그래서 하나하나 위와 똑같이 해결해본다. 

 

 

< 실행화면 >

 

 

 

 

< 실행화면 >

 

 

 

 

< 실행화면 >

이렇게 하나 하나 처리하면 안전하지만 복잡하기 때문에 한번에 처리하는 방법을 사용해 볼 것이다.

 

 

 

 

catch() 안에 Exception e 로 적으면 하위에 있는 모든 예외객체들을 받을 수 있는데 업캐스팅된 것으로 볼 수 있다.

 

< 실행화면 >

catch(Exception e)로 한번에 적으면 처음 에러가 발생한 위치를 알 수 있다.

 

 

해당 예외를 해결하기 위해 null 예외발생한 str.toString();을 주석처리하면 된다.

그러면 다음 예외가 어디인지 알게 된다.

이렇게

 

 

 

 

● finally

finally는 어떤 예외가 발생하더라도 반드시 실행해야하는 부분이다.

 

< 실행코드 >

 

 

 

 

 

 

 

 

 

 

참고 : https://wikidocs.net/229, https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%ACException-%EB%AC%B8%EB%B2%95-%EC%9D%91%EC%9A%A9-%EC%A0%95%EB%A6%AC