2020년 11월 11일
업데이트:
프로그램 오류
프로그램 수행 시 치명적 상황이 발생하여 비정상 종료
상황이 발생한 것으로 프로그램 에러라고도 한다.
오류의 종류
- 컴파일 에러 : 프로그램의 실행을 막는 소스 코드상의 문법 에러. 소스 코드 수정으로 해결이 가능하다.
- 런타임 에러 : 프로그램 실행 중 발생하는 에러로 주로 if문 사용으로 에러 처리를 한다.
- 시스템 에러 : 컴퓨터 오작동으로 인한 에러로 소스 코드 수정으로 해결이 불가능하다.
오류 해결 방법
소스 코드 수정으로 해결 가능한 에러를 예외(Exception)
라고 하는데 이러한 예외 상황(예측 가능한 에러) 구문 처리 방법인 예외 처리를 통해 해결한다.
try ~ catch
try{} : 예외가 발생할 가능성이 있는 코드를 블록{} 내에 작성하고 시도하는 구문
catch(매개변수){} : try 구문에서 발생한 예외를 잡아내서 처리하는 구문
// ExceptionService.java
public void example1() {
Scanner sc = new Scanner(System.in);
System.out.println("입력된 정수 두개를 나눈 몫 구하기");
System.out.print("입력 1 : ");
int num1 = sc.nextInt();
System.out.print("입력 2 : ");
int num2 = sc.nextInt();
/* if(num2 == 0) {
System.out.println("0으로 나눌 수 없습니다.");
} else {
System.out.println("결과 : " + num1/num2);
}*/
try {
System.out.println("결과 : " + num1/num2); // 이 안에서 에러가 발생하면 -- exception을 던진다고 함
}catch(ArithmeticException e) { // 예외를 잡는다.
// ArithmeticException : 산술 예외
// try 구문 내에서 ArithmeticException이 발생할 경우
// catch에 작성된 매개변수로 해당 예외를 잡음.
System.out.println("0으로 나눌 수 없습니다.");
}
// if문 해보기 전에 조건검사해서 걸러냄. try,catch 시도해보다가 오류 발견하면 걸러냄
}
public static void example2() {
//String 배열에 저장된 각 요소들의 제일 앞글자만 출력하기
String[] arr = new String[3];
arr[0] = "아이스 아메리카노";
arr[1] = "카페 라떼";
for(int i=0; i<=arr.length; i++) {
try {
System.out.println(arr[i].charAt(0));
}catch(NullPointerException e) {
System.out.println(i+"번째 인덱스에 참조할 값이 없습니다.");
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println("배열의 범위를 벗어났습니다.");
}
}
//java.lang.NullPointerException : 참조하고 있는 값, 객체가 없는 예외 상황
}
public static void example3() {
//String 배열에 저장된 각 요소들의 제일 앞글자만 출력하기
String[] arr = new String[3];
arr[0] = "아이스 아메리카노";
arr[1] = "카페 라떼";
for(int i=0; i<=arr.length; i++) {
try {
System.out.println(arr[i].charAt(0));
}catch(NullPointerException e) {
System.out.println(i+"번째 인덱스에 참조할 값이 없습니다.");
}catch(Exception e) {
//Exception 모든 예외의 최상위 부모
System.out.println("무슨 예외인지는 모르겠지만 예외 발생");
}
// catch문을 여러 번 작성할 경우
// try구문에서 발생한 예외를 작성된 catch문 순서대로 비교를 진행함.
// --> 매개변수가 맞는 catch가 있다! -->해당 catch 구문에서 예외 처리 진행
// 발생되는 예외들도 결국에는 클래스이고, 상속 구조를 가짐.
// --> 상속이 되면 다형성이 된다. 부모타입의 예외 참조 변수로 = 자식 예외 객체 참조 가능.
}
}
public void example4() {
// 메뉴 번호를 입력 받을 때 문자를 입력하는 경우 처리
Scanner sc = new Scanner(System.in);
int sel =0;
do {
System.out.println("1. example1() 호출");
System.out.println("2. example2() 호출");
System.out.println("3. example3() 호출");
System.out.println("0. 종료");
System.out.print("메뉴 선택 >>");
try {
sel = sc.nextInt(); //예외 발생 지점
// 예외처리 구문 하는 제일 중요한 역할!!
// -> 프로그램의 비정상 종료를 막는 것!
switch(sel) {
case 1 : example1(); break;
case 2 : example2(); break;
case 3 : example3(); break;
case 0 : System.out.println("프로그램 종료"); break;
default : System.out.println("1,2,3,0만 입력해 주세요");
}
} catch(InputMismatchException e) {
System.out.println("정수만 입력해 주세요.");
sel = -1;
sc.nextLine();
}
} while(sel != 0);
}
}
댓글남기기