[ JAVA ] 예외와 예외처리 ( 2 )

2022. 1. 15. 18:24JAVA


예외 발생 처리


1. 상세설명(message) 설정강제 

2. 미확인 예외들(Exception)과 섞임 방지

 

 

class MyException extends Exception{
	MyException(String message){
		// 현재 에러가 발생하지 않는 이유
		// 자식클래스의 모든 생성자는
		// 부모클래스의 기본생성자를 즉시 호출
		super(message);
	}
}
Exception excep1=new Exception();
Exception excep2=new Exception("임의의 예외");
// Exception 클래스의 생성자는 오버로딩되어 있음

Scanner sc=new Scanner(System.in);
while(true) {
	System.out.println("입력>> "); // 1~3만 허용
	try {
		int num=sc.nextInt();
		if(num<1 || 3<num) {
			throw excep2; // 일부러 예외 발생
			// 반드시 try-catch 필요
		}
	}
	catch(Exception e) {
		e.printStackTrace();
		System.out.println(e.getMessage());
	}
}
public class Test03 {
	public static void main(String[] args) {
		// 시외버스예약 프로그램
		// 나이: 정수 -> 1~200 유효 / 201,0 -> 유효성 처리
		// 유효성 처리를 예외 처리로 변경하자

		MyException myExcep=new MyException("1~3 이외의 입력은 불가");
		// Exception 클래스의 생성자는 오버로딩되어 있음

		Scanner sc=new Scanner(System.in);
		while(true) {
			System.out.println("입력>> "); // 1~3만 허용
			try {
				int num=sc.nextInt();
				if(num<1 || 3<num) {
					throw myExcep; // 일부러 예외 발생
					// 반드시 try-catch 필요
				}
			}
			catch(Exception e) {
				System.out.println(e.getMessage());
			}
		}
	}
}

 

 


 

 

 

import java.util.InputMismatchException;
import java.util.Scanner;

class MyException extends Exception{
	// 기존에는 예외가 아니었던 사항
	MyException(String message){
		super(message);
	}
}

public class Test04 {
	public static void main(String[] args) {
		MyException excep=new MyException("범위 외 입력");
		Scanner sc=new Scanner(System.in);
		
		while(true) {
			System.out.println("10을 무엇으로 나누겠습니까?(1~100)");
			System.out.println("정수 입력: ");
			try {
				int num=sc.nextInt();
				if(num<0 || 100<num) {
					throw excep;
				}
				int res=10/num;
				System.out.println(10+"/ "+num+" = "+res);
			}
			catch(ArithmeticException e) {
				System.out.println("계산불가");
			}
			catch(InputMismatchException e) {
				// 버퍼문제 -> console 화면을 UI로 사용하고 있어서 문제됨
				sc.nextLine();
				System.out.println("정수만 입력");
			}
			catch(MyException e) {
				System.out.println(e.getMessage());
			}
			catch(Exception e) {
				e.printStackTrace();
				break;
			}
		}
	}
}

 

 

 


 

 

학생부 프로그램 작성하기

 

 

 

1. 학생 클리스를 만들어준다.

 

class Student{
	int pk; // 학번
	String name; // 학생이름
	int score; // 점수
	
	Student(int pk,String name,int score){
		this.pk=pk;
		this.name=name;
		this.score=score;
	}
	void update(int pk,String name,int score) {
		this.pk=pk;
		this.name=name;
		this.score=score;
	}
	@Override
	public String toString() {
		return "학번:"+pk+", 이름:"+name+", 점수="+score;
	}
}

 

 

2. 예외처리를 작성해준다.

 

// 예외처리
class MyException extends Exception{
	// 기존에는 예외가 아니었던 사항
	MyException(String message){
		super(message);
	}
}

 

 

3. 해당 내용에 로직을 추가해주다.

 

public class Test01 {
	public static void main(String[] args) {
		MyException me1=new MyException("범위 외 입력입니다.(1~4)");
		MyException me2=new MyException("범위 외 입력입니다.(0~100)");
		ArrayList<Student> data=new ArrayList<Student>();
		int pk=1001; // 학번 시작은 1001부터
		Scanner sc=new Scanner(System.in);

		// 제목은 1회만 출력
		System.out.println("===학생부 프로그램==========");
		while(true) {
			System.out.println("1. 학생 추가");
			System.out.println("2. 학생 삭제");
			System.out.println("3. 출석부 출력");
			System.out.println("4. 프로그램 종료");
			System.out.print("입력>> ");
			try {
				int act=sc.nextInt();
				if(act<1 || 4<act) {
					throw me1;
				}
				if(act==1) {
					// 학생 추가
					System.out.println("이름: ");
					String name=sc.next();
					System.out.println("성적: ");
					int score=sc.nextInt();
					if(score<0 || 100<score) {
						throw me2;
					}
					data.add(new Student(pk++,name,score));
					System.out.println("학생 추가 성공");
				}
				else if(act==2) {
					// 학생 삭제
					// pk 존재하는지 확인
					// 없으면 없다고 안내
					// 있으면 삭제
					System.out.println("삭제할 학생번호입력: ");
					int sNum=sc.nextInt();
					boolean flag=true;
					for(int i=0;i<data.size();i++) {
						if(data.get(i).pk==sNum) {
							flag=false; // F 데이터 존재
							data.remove(i);
							break;
						}
					}
					if(flag) {
						System.out.println("데이터 부재로 삭제 불가");
					}
					else {
						System.out.println("학생 삭제 성공");
					}
				}
				else if(act==3) {
					// 학생 리스트 출력
					Iterator itr=data.iterator(); // 이터레이터 적용
					if(data.size()==0) {
						System.out.println("학생이 없습니다.");
						continue;
					}
					while(itr.hasNext()) {
						System.out.println(itr.next());
					}
				}
				else if(act==4) {
					System.out.println("감사합니다.");
					break;
				}
				else {
					throw me1;
				}
			}
			catch(InputMismatchException e) {
				sc.nextLine();
				System.out.println("정수만 입력하세요.");
			}
			catch(MyException e) {
				System.out.println(e.getMessage());
			}
			catch(Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 

'JAVA' 카테고리의 다른 글

[ JAVA ] 예외와 예외처리 ( 3 )  (0) 2022.01.15
[ JAVA ] 예외와 예외처리 ( 1 )  (0) 2022.01.13
[ JAVA ] 형변환  (0) 2022.01.12
[ JAVA ] 메서드 ( 함수 )  (0) 2022.01.12
[ JAVA ] 배열 활용하여 서점 프로그램 구현하기  (0) 2022.01.12