예외처리를 한다면 오류 상황을 우회(try-catch)하고 정상적으로 실행하게 해준다.
import java.util.Scanner;
public class ExceptionExample {
Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
ExceptionExample obj = new ExceptionExample();
obj.process();
}
public void process() {
int[] num = new int[5];
System.out.println("실행1");
// num의 크기가 5이므로 범위를 벗어 났다는 에러가 뜬다 (ArrayIndexOutOfBoundsException)
for(int i =0; i<10; i++) {
System.out.println(num[i]);
}
// 위에서 에러가 난 경우 실행되지 않는다.
System.out.println("실행2");
}
}
실행1
0
0
0
0
0
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at kr.or.ddit.study10.ExceptionExample.process(ExceptionExample.java:19) // 문제가 발생한 행
at kr.or.ddit.study10.ExceptionExample.main(ExceptionExample.java:10)
try-catch 사용시
import java.util.Scanner;
public class ExceptionExample {
Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
ExceptionExample obj = new ExceptionExample();
obj.process();
}
public void process() {
int[] num = new int[5];
System.out.println("실행1");
try {
// num의 크기가 5이므로 범위를 벗어 났다는 에러가 뜬다 (ArrayIndexOutOfBoundsException)
for(int i =0; i<10; i++) {
System.out.println(num[i]);
}
} catch (Exception e) {
// 출력하지 않을 시 오류메세지가 뜨지않음
e.printStackTrace();
// 오류를 예측이 가능할 때 사용자가 메세지를 설정해줄 수 있다
System.out.println("배열이 범위를 벗어남.");
}
// 위에서 에러가 난 경우 실행되지 않는다.
System.out.println("실행2");
}
}
실행1
0
0
0
0
0
java.lang.ArrayIndexOutOfBoundsException: 5
at kr.or.ddit.study10.ExceptionExample.process(ExceptionExample.java:20)
at kr.or.ddit.study10.ExceptionExample.main(ExceptionExample.java:10)
배열이 범위를 벗어남.
실행2
일반 예외 (exception)
자바 소스 컴파일 과정에서 해당 예외 처리 코드 있는지 검사하게 됨
빨간색 줄로 에러를 인식하여 컴파일과정에서 예외 처리 코드를 검사함 (ex. casting과정)
실행 예외 (runtime exception)
실행 시 예측할 수 없이 갑자기 발생하기에 컴파일 과정에서 예외처리코드 검사하지 않음
import java.util.InputMismatchException;
import java.util.Scanner;
public class ExceptionExample {
Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
ExceptionExample obj = new ExceptionExample();
obj.process();
}
public void process() {
int[] num = new int[5];
System.out.println("실행1");
try {
for(int i =0; i<10; i++) {
num[i]=sc.nextInt();
}
// casting 에러
} catch (InputMismatchException e) {
System.out.println("숫자를 입력해주세요");
// Exception은 전체 예외를 뜻하기 때문에 세부적 오류를 파악하기 위해 원하는 오류를 직접
// 다중 catch문을 사용해 입력해야한다.
// 배열 에러
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("배열이 범위를 벗어남.");
//모든 에러 처리
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("실행2");
}
}
try-catch-finally 블록
try블록 코드가 예외발생없이 정상실행되면 catch블록의 코드는 실행되지 않고 finally 블록 코드를 실행
try → finally (예외발생 X)
예외가 발생된다면 실행을 멈추고 catch블록으로 이동해 예외 처리코드 블록 실행 이후 finally 블록 코드 실행
try → catch → finally (예외발생O)
finally 블록은 생략가능하며, 예외와 무관하게 항상 실행할 내용이 있는 경우에만 작성
throws 키워드
메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 넘기는 역할
throw 키워드 뒤에는 떠넘길 예외 클래스(넘길 에러, 모든 에러를 넘길 경우엔 Exception)를 쉼표로 구분하여 나열
리턴타입 메소드이름(매개변수, ...) throws 예외클래스1, 예외클래스2, ... {
}
import java.util.Scanner;
public class ThrowsExample {
Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
ThrowsExample obj = new ThrowsExample();
obj.process();
}
public void process() {
System.out.println("1. 회원 생성");
int sel = sc.nextInt();
if (sel == 1) {
try {
//호출 시 오류가 생성되므로 try-catch 처리
makeMember();
} catch (Exception e) {
System.out.println("회원가입에 실패하였습니다");
System.out.println("다시 가입하시겠습니까?");
}
}
}
// throws를 하면 위에서 메소드를 호출 시 오류 발생
public Member makeMember() throws Exception {
Member member = new Member();
System.out.println("정보 입력");
member.name = sc.next();
member.age = sc.nextInt();
return member;
}
}
class Member {
String name;
int age;
}
'JAVA > JAVA BASIC' 카테고리의 다른 글
[JAVA] 프로젝트 전, 참고 내용 (0) | 2024.04.01 |
---|---|
3/29 Homework (0) | 2024.03.29 |
[JAVA] 컬렉션 연습 (0) | 2024.03.29 |
3/28 Homework (0) | 2024.03.28 |
[JAVA] Collection Framework (1) | 2024.03.28 |