티스토리 뷰

반응형

 

 

🤔 프로그램 오류란?

✔ 컴파일 에러(compile-time error) : 컴파일 할 때 발생하는 에러

✔ 런타임 에러(runtime error) : 실행할 때 발생하는 에러 (프로그램 종료)

✔ 논리적 에러(logical error) : 작성 의도와 다르게 동작 (프로그램 종료 x)

 

 

🤔 예외처리의 정의와 목적

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

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

 

 

 

🤔 try-catch문에서의 흐름

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

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

2. 일치하는 catch블럭을 찾게 되면,

그 catch블럭 내의 문장들을 수행하고

전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행

만일 일치하는 catch블럭을 찾지 못하면, 예외처리 안함.

 

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

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

 

 

다음의 출력결과를 예측해보라.

class Tes {
    public static void main(String[] args) {
        System.out.println(1);
        try {
            System.out.println(0 / 0); // 예외발생!!
            System.out.println(2);
        } catch(ArithmeticException ae) {
            System.out.println(3);
        } // try-catch의 끝
        System.out.println(4);
    } // main 메서드의 끝
}

 

실행결과

실행결과

 

 

✔ Exception이 선언된 catch블럭은 모든 예외 처리(마지막 catch 블럭)

 

 

🤔 printStackTrace()와 getMessage()란?

✅ printStackTrace() 란?

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

 

✅ getMessage() 란?

발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.

 

 

🤔 예외 발생시키기

 

코드를 보며 이해하자.

class Tes {
    public static void main(String[] args) {
        try {
            Exception e = new Exception("고의로 발생시켰음.");
            throw e; // 예외를 발생시킴
//            throw new Exception("고의로 발생시켰음."); // 위  두 줄을 한 줄로 작성
        } catch(Exception e) {
            System.out.println("에러 메시지 : " + e.getMessage());
            e.printStackTrace();
        }
        System.out.println("프로그램이 정상 종료되었음.");
    }
}

 

 

🤔 cheked 예외, unchecked 예외

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

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

 

 👉 Exception과 자손 : checked 예외 (try-catch 필수)

👉 RuntimeException과 자손 : unchecked 예외 (try-catch 선택)

 

 


 

✅ 예외 처리 방법

✔ try-catch문

✔ 예외 떠넘기기(알리기)

 

 

 

🤔 메서드에 예외 선언하기

 

import java.io.File;

class Tes {
    public static void main(String[] args) {
        try {
//            File f = createFile(args[0]);
            File f = createFile("test2.txt");
            System.out.println(f.getName() + "파일이 성공적으로 생성되었습니다.");
        } catch(Exception e) {
            System.out.println(e.getMessage()+" 다시 입력해 주시기 바랍니다.");
        }
    }// main 메서드 끝

    static File createFile(String fileName) throws Exception {
        if(fileName==null || fileName.equals(""))
            throw new Exception("파일이름이 유효하지 않습니다.");
        File f = new File(fileName); // File 클래스의 객체를 만든다.
        // File 객체의 crateNewFile 메서드를 이용해서 실제 파일을 생성한다.
        f.createNewFile();
        return f; // 생성된 객체의 참조를 반환한다.
    } // createFile 메서드의 끝
} // 클래스의 끝

 

 

import java.io.File;
import java.io.IOException;

class Tes {
    public static void main(String[] args) {
//            File f = createFile(args[0]);
        File f = createFile("");
        System.out.println(f.getName() + "파일이 성공적으로 생성되었습니다.");
    }// main 메서드의 끝

    static File createFile(String fileName) { //throws exception {
        try {
            if (fileName == null || fileName.equals(""))
                throw new Exception(("파일이름이 유효하지 않습니다."));

        } catch (Exception e) {
            fileName = "제목없음.txt";
        }

        File f = new File(fileName); //file클래스의 객체를 만든다.
        // File 객체의 createNewFile 메서드를 이용해서 실제 파일을 생성한다.
        try {
            f.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return f; // 생성된 객체의 참조를 반환한다.
    } // createFile 메서드의 끝
}// 클래스의 끝

 

 

✅ finally 블럭 : 예외 발생여부와 관계없이 수행되어야 하는 코드를 가지는 블럭

 


 

오늘도 많은 것을 알게되었다.

내일 또 열심히 공부하자. 😆

반응형