새소식

java

Exception

  • -

유튜브 생활코딩

Exception e 코드에서 e는 변수(이름 수정 가능) Exception은 변수의 데이터 타입(변경 불가)

catch 문의 print문에 브레이크 포인트를 걸고 디버거를 실행시키면 자세한 예외내용을 볼 수 있음

또는 e(변수명).getMessage() 메서드를 이용해서 확인 가능함

 

유튜브 생활코딩

printStackTrace() 메서드를 통해 프로그램 출력 마지막 부분에 에러 내용 전체를 출력 가능
위 메서드와 같은 에러 메세지가 사용자에게 보여지게 하면(특히나 서버 관련 일에서) 그 메세지에서 보안적인 사고를 낼 수 있는 단서를 제공할 수 있어서 관리자들에게만 보여지게 해야됨(로깅 시스템 이용 통해 해결 가능)

 

 

  • 부모(조상) Exception 은 자식 Exception 을 다 포괄함, catch문에서도 자식/부모 관계의 Exception을 어떻게 배치하느냐에 따라 우선순위가 달라짐

유튜브 생활코딩

Exception(제일 부모 위치의 예외) 로 인해 부모의 예외가 실행되고 산술/배열과 관련된 예외는 실행되지 않음

유튜브 생활코딩

Exception(부모 예외)가 뒷 순서의 catch문에서 작동하기에 산술예외 코드가 실행됨

( 위 코드에서 산술예외는 발생하지 않아서 부모 예외(=Exception)가 실행됨)

 

 

 

 

CheckedException  vs  UnCheckedException

UnCheckedException: try/catch문을 쓰지 않아도 컴파일 가능, runtimeException을 포함한 그 자식들

CheckedException: Exception의 직계자손 runtimeException이 아닌 exception들이며 try/catch 나 throw문을 통해 작성

 

사용할 메소드가 체크 예외가 발생되면 예외처리( (try/catch) 문이나 throws )를 정의해서 메소드 밖으로 처리시켜야 한다.

UnCheckedException, exception이 발생했을때 error발생
CheckedException

import java.io.FileWriter;
import java.io.IOException;
 
public class CheckedExceptionApp {
    public static void main(String[] args) {
        try {
            FileWriter f = new FileWriter("data.txt");
            f.write("Hello");
            // close를 하기 전에 예외가 발생할 수 있기 때문에 finally로 처리해야 합니다.
            // close를 하기 전에 예외가 발생하면 catch문 실행으로 인해 close의 처리 기회가 없습니다.
            f.close();
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

위 코드의 finally와 관련해서는 아래의 코드로 해결

import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
 
import java.io.FileWriter;
import java.io.IOException;
 
public class CheckedExceptionApp {
    public static void main(String[] args) {
        FileWriter f = null;
        try {
            f = new FileWriter("data.txt");
            f.write("Hello");
        } catch(IOException e){
            e.printStackTrace();
        } finally {
            // 만약에 f가 null이 아니라면
            if(f  != null) {
                try {
                    f.close();
                } catch(IOException e){ //close할때 IOException이 발생할 수 있기에 catch 사용
                    e.printStackTrace();
                }
            }
        }
    }
}

아래는 try-with-resource 방법을 이용한것.

try(close할 내용){내용}

자동으로 close가 되기에 close코드 또한 필요없게 됨

import java.io.FileWriter;
import java.io.IOException;
 
public class TryWithResource {
    public static void main(String[] args) {
        // try with resource statements
        try (FileWriter f = new FileWriter("data.txt")) {
        //try 옆 괄호에는 세미콜론이 포함되면 안됨
            f.write("Hello");
        } catch(IOException e){
            e.printStackTrace();
        }
    }
}

'java' 카테고리의 다른 글

상속  (0) 2023.01.08
생성자와 this (기초개념)  (0) 2023.01.08
함수의 타입(추가 예정)  (0) 2022.12.22
클래스 메서드와 인스턴스 메서드  (0) 2022.12.20
변수 선언에 관련하여  (0) 2022.12.20
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.