재밌고 어려운 IT를 이해해보자~!

예외처리 (try-catch) 본문

JAVA Error Solution

예외처리 (try-catch)

언제나즐거운IT 2023. 12. 8. 13:56

예외란?
   예외,에러,오류,이슈,문제,컴플레인,...
   프로그램을 비정상적으로 종료되게하는 문제들
      => 사용자가 원할때 종료하는 것이 바람직하다.

 

실제로 어떤 기능을 정상적으로 돌아가게 하는 것 보다 그외에 이슈가 생기는 것들을 해결하는 것이 훨씬 힘들다!!!

 

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
Comments