재밌고 어려운 IT를 이해해보자~!
예외처리 (try-catch) 본문
예외란?
예외,에러,오류,이슈,문제,컴플레인,...
프로그램을 비정상적으로 종료되게하는 문제들
=> 사용자가 원할때 종료하는 것이 바람직하다.
실제로 어떤 기능을 정상적으로 돌아가게 하는 것 보다 그외에 이슈가 생기는 것들을 해결하는 것이 훨씬 힘들다!!!
Exception
예외가 발생되면 캡쳐 → 원인파악 → 해결책 블로그 포스팅 !!!!!!!!!!!
Exception을 사용한 해결책말고..근본적인 해결방안을 생각해보자.
예외는 발생되면 프로그램이 즉시 종료됨
예외처리를 왜 해야하는가?
프로그램은 절대 비정상종료되면 안되죠당연히.
1) 예외가 발생되면 무시하고 다음 스텝으로 이동
2) 예외가 발생할수있으니까, 제대로 사용해~하고 안내해준다.
try문
예외가 발생할 것 같은 코드들을 작성
catch문
예외가 발생되는 그 즉시 수행됨
예외가 발생할때에만 수행됨
앞으로 모든 예외를 기록해두자.......꼭!!
ex)
package class01;
import java.util.Scanner;
public class Test03 {
public static void main(String[] args) {
int a=10,b=1;
System.out.println(a/b);
System.out.println("-----");
int[] datas=new int[3];
System.out.println(datas[2]);
System.out.println("-----");
Scanner sc=new Scanner(System.in);
System.out.print("정수입력 >> ");
int num;
try {
num=sc.nextInt();
System.out.println("로그 01");
} catch(Exception e) {
num=100;
// 정수값이 아닌값이 입력되면,
// 100으로 값 저장
System.out.println("로그 02");
}
System.out.println(num);
}
}
입력을 받을때 정수가 들어오지 않으면 바로 catch문으로 들어간다. 이때 "Exception e" 는 모든 에러에 대해 동일한 구문을 실행하는 것이다.
그럼 인덱스에러, 입력타입에러 등등 다양한 에러에 대응하는 예외처리를 하고싶으면 어떻게 해야할까?
package class01;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test04 {
public static void main(String[] args) {
int num;
try {
int a = 10, b = 3;
System.out.println(a / b);
System.out.println("-----");
int[] datas = new int[3];
System.out.println(datas[1]);
System.out.println("-----");
Scanner sc = new Scanner(System.in);
System.out.print("정수입력 >> ");
num = sc.nextInt();
System.out.println("num= " + num);
} catch (ArithmeticException e) {
System.out.println("0으로는 나눌수없습니다!");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("인덱스 범위초과로 출력 불가능합니다!");
} catch (InputMismatchException e) {
System.out.println("num을 100으로 초기화합니다...");
num = 100;
System.out.println("num= " + num);
}
}
}
상위 코드처럼 정확한 에러명과 그에따른 행동을 작성해주면 된다. 그럼 해당 에러가 일어났을때 대응하는 catch문으로 자동으로 찾아간다.
에러가 났을때 하나하나씩 추가보단, 에러명을 잘 알아둬서 해당에러가 일어날 수 있을지 판단 후 미리 작성해 두면 좋을 것 같다.
문제!
[문제 1]
사용자가 1~10사이의 정수를 입력해야합니다. 정상입력해야 종료됩니다.
정수입력 >> 정수
정수를 입력해주세요!
정수입력 >> 11
1~10사이로 입력해주세요!
정수입력 >> 5
5를 입력했습니다! :D
[문제 2]
[10 1 2 0 -2] 배열리스트가 있습니다.
사용자에게 정수를 입력받습니다. ex) 1
100/배열리스트 1번째정수 의 결과를 출력해주세요!~~
100/10=10
사용자에게 정수를 입력받습니다. ex) 3
100/배열리스트 1번째정수 의 결과를 출력해주세요!~~
100/2=50
단, 100/0의 경우 0으로는 나눌수없습니다. 를 출력해주세요!~~
//강사님코드
package class01;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test05 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(true) {
System.out.print("정수입력 >> ");
int num;
try {
num=sc.nextInt();
}catch(InputMismatchException e) {
sc.nextLine(); // 버퍼 공간에 있는 잘못 입력된 값을 제거하는 역할
System.out.println("정수를 입력해주세요!");
continue;
}
if(1<=num && num<=10) {
System.out.println(num+"을(를) 입력했습니다! :D");
break;
}
System.out.println("1~10사이로 입력해주세요!");
}
System.out.println("================================");
ArrayList<Integer> datas=new ArrayList<Integer>();
datas.add(10);
datas.add(1);
datas.add(2);
datas.add(0);
datas.add(-2);
System.out.println(datas);
System.out.print("정수입력 >> ");
int num;
int result;
try {
num=sc.nextInt();
result=100/datas.get(num-1);
}catch(IndexOutOfBoundsException e) {
System.out.println("해당 인덱스 요소는 없습니다...");
return;
}catch(ArithmeticException e) {
System.out.println("0으로는 나눌수없습니다.");
return;
}catch(InputMismatchException e) {
System.out.println("정수를 입력하셔야합니다...");
return;
}
System.out.println(100+"/"+datas.get(num-1)+"="+result);
}
}
나는 0으로 나눴을때만 예외처리를 하도록 했는데 강사님께서는 나올 수 있는 모든 예외를 처리해주셨다 :D
앞으로 잘 생각해보자 ......
'JAVA Error Solution' 카테고리의 다른 글
NullPointerException (0) | 2023.12.20 |
---|---|
NullPointerException (0) | 2023.12.12 |
IndexOutOfBoundsException (0) | 2023.12.10 |
NoSuchElementException (0) | 2023.12.10 |
Unresolved compilation problem (1) | 2023.12.08 |