반응형

Null Pointer Exception

package chap10.sec01.exam01;

/**
 * packageName : chap10.sec01.exam01
 * fileName : NullApplication
 * author : GGG
 * date : 2023-09-26
 * description : 예외처리(에러처리), null pointer exception(널 에러)
 * 요약 :
 *
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class NullApplication {
    public static void main(String[] args) {
//        TODO : null 발생시키는 코드
        String data = null;
        System.out.println(data.toString());        // null 에러 발생
    }

}

nullpointerexception 에러 발생

 

Out of Bound 에러

* description : 배열의 지정된 index 보다 큰 값을 조회할 때 발생하는 에러
*               Out of Bound 에러
*               예) 10개짜리인 배열 : 인덱스 번호 => 0 ~ 9
*               => 코딩에서 11인덱스를 조회하면 위의 에러가 발생
package chap10.sec01.exam02;

/**
 * packageName : chap10.sec01.exam02
 * fileName : OutOfBoundApplication
 * author : GGG
 * date : 2023-09-26
 * description : 배열의 지정된 index 보다 큰 값을 조회할 때 발생하는 에러
 *               Out of Bound 에러
 *               예) 10개짜리인 배열 : 인덱스 번호 => 0 ~ 9
 *               => 코딩에서 11인덱스를 조회하면 위의 에러가 발생
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class OutOfBoundApplication {
    public static void main(String[] args) {
//        TODO : Out of Bound 에러 발생시키는 코드
//         현재 main의 매개변수는 기본적으로 없음
        String data1 = args[0];
        String data2 = args[1];
        System.out.println(data1);
        System.out.println(data2);
    }
}
배열이 없는데 조회해서 에러가 발생함

 

NumberFormatException 에러

* description : Number Format 에러[예외](Exception) :
*                 문자열 -> 숫자로 변경하였는데 그 숫자 형태가 잘못되었을 경우 발생
package chap10.sec01.exam03;

/**
 * packageName : chap10.sec01.exam03
 * fileName : NumberFormatApplication
 * author : GGG
 * date : 2023-09-26
 * description : Number Format 에러[예외](Exception) :
 *                 문자열 -> 숫자로 변경하였는데 그 숫자 형태가 잘못되었을 경우 발생
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class NumberFormatApplication {
    public static void main(String[] args) {
//        TODO : 강제로 Number Format 에러 발생
        String data1 = "100";
        String data2 = "a100";
//        TODO : 문자열 -> 숫자로 변경 : Integer.parseInt()
        int value1 = Integer.parseInt(data1);
        int value2 = Integer.parseInt(data2);       // a100은 숫자 변환 안됨
        System.out.println(data1 + " " + data2);

    }
}

 

ClassCastException 에러

* description :  Class Cast 에러[예외](Exception)
*              => 클래스 형변환시 적절한 클래스를 안넣으면 에러 발생
package chap10.sec01.exam04;

/**
 * packageName : chap10.sec01.exam04
 * fileName : ClassCastApplication
 * author : GGG
 * date : 2023-09-26
 * description :  Class Cast 에러[예외](Exception)
 *              => 클래스 형변환시 적절한 클래스를 안넣으면 에러 발생
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class ClassCastApplication {
    public static void main(String[] args) {
//        강아지 객체 생성
        Dog dog = new Dog();
        changeDog(dog);     // 가능(매개변수의 다형성)
//        TODO : Class Cast 에러 발생 코드
//        고양이 객체 생성
        Cat cat = new Cat();
        changeDog(cat);     // 에러발생 => 고양이를 강아지로 강제 형변환 불가, 강아지 객체를 넣어야함

    }
//    공유 함수
    public static void changeDog(Animal animal){
//        강제 형변환 : Dog
        Dog dog = (Dog)animal;
    }
}

// 동물 클래스
class Animal{}
// 강아지
class Dog extends Animal{}
// 고양이
class Cat extends Animal{}

Exception in thread "main" java.lang.ClassCastException: class chap10.sec01.exam04.Cat cannot be cast to class chap10.sec01.exam04.Dog (chap10.sec01.exam04.Cat and chap10.sec01.exam04.Dog are in unnamed module of loader 'app')
at chap10.sec01.exam04.ClassCastApplication.changeDog(ClassCastApplication.java:31)
at chap10.sec01.exam04.ClassCastApplication.main(ClassCastApplication.java:25)

 

예외처리 - 에러처리를 하는 이유?

*        (참고) : 예외(개발자 에러) vs 시스템 에러(자바가상머신 에러)
*        에러처리를 왜 하는가? 에러(예외)가 발생하면 콘솔에 빨간줄의 에러코드가 나타남
*           => 사용자 입장에서 보기가 좋지 않음
*           => 목적) 에러처리를 이용해서 좀 더 품질 좋은 프로그램을 만들기 위함
*           (예) 에러발생 -> 관리자가 확인중입니다. 메시지 출력
try ~ catch 구문

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

package chap10.sec02.exam01;

/**
 * packageName : chap10.sec02.exam01
 * fileName : TryCatchFinallyApplication
 * author : GGG
 * date : 2023-09-26
 * description : 일반 예외(에러) 처리
 * 요약 :
 *        (참고) : 예외(개발자 에러) vs 시스템 에러(자바가상머신 에러)
 *        에러처리를 왜 하는가? 에러(예외)가 발생하면 콘솔에 빨간줄의 에러코드가 나타남
 *           => 사용자 입장에서 보기가 좋지 않음
 *           => 목적) 에러처리를 이용해서 좀 더 품질 좋은 프로그램을 만들기 위함
 *           (예) 에러발생 -> 관리자가 확인중입니다. 메시지 출력
 *        
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class TryCatchFinallyApplication {
    public static void main(String[] args) {
//        TODO : 에러처리 : try ~ catch 구문
//         사용법 : try { 실행문; } catch(에러클래스 변수) {에러처리실행문;}
//          => (설명) try의 실행문이 실행될때 에러가 발생하면 catch 실행문이 실행됨
        try {
//            forName(클래스명) : 클래스명에 해당되는 자바클래스를 리턴
            Class clazz = Class.forName("String2");     // 에러 발생
        } catch (ClassNotFoundException e){
            System.out.println("클래스가 존재하지 않습니다.");
        }
    }
}

package chap10.sec02.exam02;

/**
 * packageName : chap10.sec02.exam02
 * fileName : TryCatch2Application
 * author : GGG
 * date : 2023-09-26
 * description : 예외처리(에러처리) 2
 * 요약 : try ~ catch 문은 여러 번 사용 가능
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class TryCatch2Application {
    public static void main(String[] args) {
//        TODO : Out of Bound 에러 발생시키는 코드
//         현재 main의 매개변수는 기본적으로 없음
//         try ~ catch() {}
        String data1 = null;
        String data2 = null;

        try{
            data1 = args[0];
            data2 = args[1];

            System.out.println(data1);      // 에러발생 -> catch로 이동함
            System.out.println(data2);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("실행 매개변수값이 없습니다.");
        }

//        TODO : 강제로 Number Format 에러 발생
//        TODO : 문자열 -> 숫자로 변경 : Integer.parseInt()
        try {
            int value1 = Integer.parseInt(data1);
            int value2 = Integer.parseInt(data2);       // a100은 숫자 변환 안됨
            System.out.println(data1 + " " + data2);

        } catch (NumberFormatException e){
            System.out.println("숫자로 변환할 수 없습니다.");
        } finally {
            System.out.println("다시 실행하세요");
        }

    }
}

어떤 예외가 발생하더라도 반드시 실행되어야 하는 부분이 있어야 한다면 finally를 사용한다.

finally 문은 try 문장 수행 중 예외 발생 여부에 상관없이 무조건 실행된다. 

 

Catch 2개 이상 있는 예외처리

package chap10.sec02.exam03;

/**
 * packageName : chap10.sec02.exam03
 * fileName : CatchByCatchApplication
 * author : GGG
 * date : 2023-09-26
 * description : Catch 2개 이상 있는 에러(예외) 처리
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class CatchByCatchApplication {
    public static void main(String[] args) {
        try {
//         TODO : Out of Bound 에러 발생시키는 코드
//         현재 main의 매개변수는 기본적으로 없음
            String data1 = args[0];
            String data2 = args[1];
            System.out.println(data1); // 에러 발생
            System.out.println(data2);

        } catch (ArrayIndexOutOfBoundsException e){
            System.out.println("실행 매개변수 값이 부족합니다.");
        } catch (NumberFormatException e){
            System.out.println("숫자로 변환할 수 없습니다.");
        } catch (Exception e) {
            // TODO : Exception 개발자 에러의 최고 조상 클래스 : 기본에러로 설정하면 거의 탐지됨.
            System.out.println("그외의 다른 에러가 발생했습니다.");
        }

    }
}

 

예외 던지기

예외가 발생할 수 있는 코드를 작성할 때 try - catch 블록으로 처리하는 것이 기본이지만, 경우에 따라서는 다른 곳에서 예외를 처리하도록 호출한 곳으로 예외를 떠넘길 수도 있다.

package chap10.sec02.exam04;

/**
 * packageName : chap10.sec02.exam04
 * fileName : ThrowsApplication
 * author : GGG
 * date : 2023-09-26
 * description : Throws, 예외(에러) 처리 떠넘기기
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class ThrowsApplication {
    public static void main(String[] args) {
        
        try {
            findClass();        // 공유함수 호출    
        } catch (Exception e){
            System.out.println("클래스가 존재하지 않습니다.");
        }
        
    }

    // 공유 함수
    // TODO : 리턴자료형 함수명() throws 에러클래스
    //   => 함수 내에서 에러처리 안하고 이 함수를 호출하는 쪽에 에러처리를 떠넘기기
    public static void findClass() throws ClassNotFoundException{
        // TODO : Class 객체 : 자바의 환경을 접근하는 자바 API 함수
        //   Class.forName("클래스명") : 해당 클래스를 리턴
        Class clazz = Class.forName("String2");
    }
}

 

반응형

'Java > Java 이론' 카테고리의 다른 글

날짜 함수  (0) 2023.09.26
JAVA API 함수  (0) 2023.09.26
자료구조 - Stack / Queue  (0) 2023.09.26
객체의 동등비교  (1) 2023.09.25
자료구조  (0) 2023.09.25

+ Recent posts