package ex_exception;
public class Ex1 {
public static void main(String[] args) {
/*
* 예외(Exception)
*
* < 예외 관련 용어 >
* 1. 예외가 발생했을 때 예외 발생 여부를 감지하는 대상 : 리스너(Listener)
* 2. 예외가 발생했을 정상적으로 종료될 수 있도록 처리하는 것 : 예외 처리
* => 예외가 발생하지 않도록 미리 원인을 제거하는 것은 예외 처리가 아니며,
* 예외가 발생할 상황을 미리 탐지하여 예외가 발생했을 때 프로그램이 정상 종료되도록
* 처리하는 것을 예외 처리라고 한다!
*
*/
System.out.println("프로그램 시작!");
int num1 = 10, num2 = 2;
// // 자바에서 연산 시 두번째 피연산자가 0일 경우 나눗셈 과정에서 예외 발생함
// System.out.println(num1 + " / " + num2 + " = " + (num1 / num2));
//
// // => 예외 발생 코드 아래쪽의 나머지 코드는 실행되지 못한 채 비정상 종료됨!
// System.out.println("프로그램 종료!");
// 예외가 발생할 경우 예외 상황이 메세지로 출력
/*
* Exception in thread "main" java.lang.ArithmeticException: / by zero
* at ex_exception.Ex1.main(Ex1.java:24)
* 1) Exception in thread "main" java.lang.ArithmeticException:
* => 예외 발생 상황 정보 및 예외 발생을 탐지한 예외 클래스명
* (예외 발생을 탐지하는 리스너 객체 : ArithmeticException)
* 2) / by zero
* => 예외 발생 원인 메세지(0에 의한 나눗셈으로 인해 예외 발생했다는 의미)
* 3) at ex_exception.Ex1.main(Ex1.java:24)
* => 예외 발생 위치(Ex1.java 클래스의 24번 라인에서 예외 발생)
*
*/
// 만약, 예외가 발생하지 않도록 if문을 통해 피연산자 값 검사하는 경우
if (num2 != 0) {
System.out.println(num1 + " / " + num2 + " = " + (num1 / num2));
} // => 예외 처리가 아니다!
String str = null; // 참조 변수에 저장된 주소값이 없음
// null 값을 참조하는 객체에 접근하여 작업을 수행하려 할 경우
// System.out.println(str.length()); // str 문자열 크기
// 접근이 불가능하므로 NullPointerException 예외가 발생하게 된다!
int[] arr = new int[2];
// 배열 인덱스 사용 시 존재하지 않는 인덱스 사용할 경우
arr[2] = 10;
// ArrayIndexOutOfBoundsException예외가 발생하게 된다!
System.out.println("프로그램 종료!");
}
}
package ex_exception;
public class Ex2 {
public static void main(String[] args) {
/*
* 예외 처리
*
* < 기본 문법 >
* try {
* // 일반적인 코드 및
* // 예외 발생 가능성이 있는 코드들
*
* } catch (예외클래스명 변수명) {
* // 예외클래스에 해당하는 예외가 발생할 경우 처리할 코드를 기술
*
* }
*
*/
System.out.println("프로그램 시작!");
// 예외가 발생할 것으로 예상되는 코드(또는 코드 범위)를 try{} 블록으로 감싸기
try {
System.out.println("try 블록 시작!");
int num1 = 3;
int num2 = 1;
// if (num2 != 0) {} // 예외가 발생하지 않도록 코드를 수정하는 것은 예외 처리가 아니다!
// => 예외 처리란?
// 예외가 발생하더라도 나머지 코드들이 정상적으로 수행되도록 하는 것
System.out.println(num1 / num2); // 예외(ArithmeticException)가 발생하는 코드
// 현재 예외가 발생한 코드의 아래쪽 나머지 코드들은 실행되지 못하고, catch 블록으로 가서
// 예외 객체에 해당하는 클래스를 찾아 해당 catch 블록 내의 코드들을 실행!
System.out.println("try 블록 끝!"); // 예외 발생 시 실행되지 못하는 코드
String str = null;
System.out.println(str.length()); // NullPointerException 예외 발생!
} catch (Exception e) {
// ArithmeticException 예외가 try 블록 내에서 발생하면
// JVM에 의해 ArithmeticException 예외 객체가 생성되고 던져짐
// 따라서, catch 블록의 소괄호 안에 해당 예외 클래스와 일치하는 참조변수를 선언하여
// 던져지는 예외 객체를 전달받아야 한다.(catch)
// => chat 블록 중괄호 내에서 예외 발생 시 수행할 작업들을 명시
System.out.println("ArithmeticException 예외 발생! - 0으로 나눌 수 없습니다!");
if (e instanceof NullPointerException) {
System.out.println("NullPointerExcepiont 예외 발생!");
}
}
System.out.println("프로그램 종료!");
// try 문에서 예외가 발생하더라도 try문 내의 아래쪽 코드 실행만 불가능하고
// catch 블록 코드 실행 후 try ~ cat 문 밖으로 나와 나머지 코드를 정상적으로 실행함
// => 예외가 발생하더라도 프로그램이 정성작으로 종료되도록 처리됨!
}
}