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 에러 발생
}
}
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 |