[예외처리]
: 프로그램을 정상적으로 종료할 수 있게 or 프로그램을 끝까지 사용할 수 있게 코딩하는 것
※ 예외 : 코드가 예상과 다른 라인에서 멈춰버리는 현상 or 프로그램이 갑자기 종료되어버리는 현상
=> 사용자 경험 저하
□ if문으로 처리할 수도 있지만 개발자가 알아보기 쉽도록 개발자용 문법을 사용해서 예외처리하도록 한다.
try {
예외가 발생할 수 있는 코드 작성
}
catch() {
예외 발생 시 수행될 코드 작성
}
finally {
예외 발생 여부와 무관하게 항상 수행되는 코드
}
□ ( ) 안에 해당 예외 클래스를 작성하면 그 예외를 잡을 수 있음
-> 예외 발생 즉시 수행을 멈추고 catch로 이동
int[] datas= {1,2,0,3,4};
int a;
int b;
Scanner sc=new Scanner(System.in);
try{
System.out.println("정수를 2개 입력하세요.");
System.out.print(">> ");
a=sc.nextInt();
System.out.print(">> ");
b=sc.nextInt();
int res=datas[a] / datas[b]; // 5 이상 입력 시 에러 발생
System.out.println("답은 "+res);
}
catch(ArithmeticException e) {
System.out.println("0으로는 나누기 연산을 수행할수없습니다.");
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("해당 인덱스는 없습니다.");
}
catch(Exception e) {
e.printStackTrace();
}
}
}
■ Exception : 모든 예외 클래스들의 부모
catch(Exception e) {
printStackTrace();
} // 예외가 발생하는 이유를 알려주는 코드
- 예외 처리는 항상 위에서 아래로 내려오면서 수행하기 떄문에 최상위 클래스인 Exception을 가장 상단에서 수행하면 아래에 있는 예외처리에는 걸리지 않기에 에러가 발생함.
-> 부모 클래스인 Exception을 하단에 작성할 것
※ 예외 목록 중 util 패키지에 있는 애들은 import !
※ InputMismatchException 예외처리 시 버퍼를 비우는 sc.nextLine();를 같이 사용하자.
public class Test01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num;
while(true) {
System.out.print("정수 입력 >> ");
try {
num = sc.nextInt();
break; // while문의 종료조건! 짜피 올바른 수를 입력하면 catch를 만나지 않음.
}
catch(InputMismatchException e) { // 그냥 얘 쓸 때는 sc.nextLine() 반드시 쓴다고 생각
System.out.println("다시 입력!");
// 버퍼를 비우지 않으면 무한루프에 걸림
sc.nextLine(); // 버퍼에 남아있는 엔터??를 없애주는 코드..
}
}
System.out.println("num = " + num);
}
}
※ 예외 처리 종류
1. 예외 일부러 발생시키기
2. 예외 만들기
3. 예외 미루기
■ 예외 미루기 : 실제로 예외가 발생한 곳에서 예외를 처리하는 것이 아니라 해당 함수(메서드, 객체)를 호출한 곳에서 예외를 처리하는 것
- "throws" 키워드 사용 (예외처리 강제 키워드)
// 인덱스 값을 주면 그 인덱스에 해당하는 값을 전달해주는 함수
public static int kim(int index) throws Exception { // 예외 처리를 강제하는 키워드 (가져간 애한테)
int[] datas = {11,22,33};
return datas[index];
}
public static void main(String[] args) {
int num = -1;
try {
num =kim(3); // 위에서 예외를 던지면 얘가 반드시 예외처리를 해줘야 함!!
}
catch(Exception e) {
System.out.println("정확한 인덱스로 호출해야 합니다");
}
System.out.println(num);
for(int i = 0; i<10; i++) {
System.out.println("*");
try {
Thread.sleep(1000); // 1000당 1초
}// .sleep()가 throws를 작성해둬서 오류
// 자바에서 throws를 해둬서!!!!
catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
Thread.sleep(1000) 는 현재 스레드를 지정된 시간 동안 정지 상태로 만드는 기능을 하는데, 이 메서드가 사용되는 경우 InterruptedException이 발생할 가능성이 있어 예외 처리가 꼭 필요하다.
'IT > JAVA' 카테고리의 다른 글
Java Section 14 : 예외처리 (1) | 2025.01.21 |
---|---|
[DAY 14] 컬렉션 프레임워크 (1) | 2025.01.21 |
Java Section 13 : 내부 클래스 (0) | 2025.01.20 |
Java Section 12 : 추상 클래스와 인터페이스 (1) | 2025.01.19 |
Java Section 11 : 다형성과 타입 변환 (1) | 2025.01.18 |