Try-catch
Try-catch문은 예외를 처리하기 위한 구문이다.
예외가 try 블럭에서 발생한 경우 발생한 예외와 일치하는 catch 문이 있는지 확인.
일치하는 catch 문이 있다면 catch 블럭 내의 문장을 모두 실행하고 try catch 문을 빠져나가서 그다음 문장을 수행.
일치하는 catch 문이 없다면 예외는 처리되지 못하고 에러 발생.
예외가 try 블럭 안에서 발생하지 않은 경우 catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속한다.
예외가 try 블럭 밖에서 발생한 경우 예외는 아무 처리되지 못한 채 에러 발생.
괄호()와 블럭{} 두부분으로 나눠져있는데, 괄호에는 처리하고자하는 예외타입(Exception), 참조변수(e)를 선언한다.
예외발생시 발생예외에 해당하는 클래스의 인스턴스가 만들어진다.
예를 들어 ArithmeticException이 발생한다고 하면 ArithmeticException인스턴스가 생성된다.
try블럭내에서 이 예외가 발생했다면, 이를 처리할 수 있는 catch 블럭이 있는지 찾는다.
getMessage( ) : 예외 내용을 반환합니다.
printStackTrace( ) : 예외 발생위치와 내용을 알려줍니다.
package chapter20230907.Exception;
import java.util.*;
public class ExceptionTest {
public static void main(String[] args) {
// int result = 10 / 0; //예외 발생함 0을 나눌순 없음
// System.out.println("나눗셈 결과 : " + result); // 예외발생으로 실행 안됨
try { // 예외 발생가능성이 있는 코드만! try 안에 넣음
int result = 10 / 0;
} catch (ArithmeticException e) { // ArithmeticException e - 오류가 발생하여도 끝까지 실행하게 함, catch는 여러개 작성 가능
System.out.println("0으로 나눌 수 없습니다."); // 예외가 발생하면 catch가 실행되고 정상적이면 실행 안함
}
System.out.println("프로그램은 계속 진행됩니다."); // 예외 발생 여부와 관계없이 항상 실행
}
}
package chapter20230907.Exception;
import java.util.*;
public class ExceptionTest02 {
public static void main(String[] args) {
int[] arr = {10, 20, 30};
try {
System.out.println("arr[2] =" + arr[2]);
System.out.println("arr[3] =" + arr[3]); // arr에 3번 인덱스는 없음 예외 발생
System.out.println("arr 출력 완료");
} catch(Exception e) {
System.out.println("예외 발생 : catch 문 수행");
}
System.out.println("try/catch 구문 밖 문장 수행");
}
}
package chapter20230907.Exception;
public class ExceptionTest05 {
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("프로그램이 정상 종료되었음");
}
}
사용자 정의 예외
기존의 API에서 제공하는 예외 클래스만으로 예외의 경우를 표현할 수 없는 예외인 경우 직접 만들어서 사용하기도 함
package chapter20230908;
class AgeException extends Exception {
public AgeException() {}
public AgeException(String message) {
super(message);
}
public void printStackTrace() {
System.out.println(getMessage());
super.printStackTrace();
}
}
public class AgeExceptionTest {
public static void ticketing(int age) throws AgeException {
if(age < 0) {
throw new AgeException("나이 입력이 잘못되었습니다.");
}
}
public static void main(String[] args) {
int age = -19;
try {
ticketing(age);
}
catch (AgeException e) {
e.printStackTrace();
}
}
}