JAVA

JAVA 예외

테라시아 2024. 11. 16. 18:33

예외처리(Exception)
(1) 에러(Error)
    컴파일 시 발생하는 에러
    런타임 시 발생하는 에러
(2) 예외
    런타임 시 발생하는 에러 중에
    개발자가 처리 가능한 에러
    cf) 처리가 불가능한 에러
        OOM(Out Of Memory)
        - 예외처리할 메모리 조차도 없음
(3) 예외처리 방법
    try {
        예외 검사를 하고 싶은 내용;
    }
    catch(예외명1){
        1번 예외에 대해 할 일;
    }
    catch(예외명2){
        2번 예외에 대해 할 일;
    }
    ....
    catch(Exception e){
        예상 불가능한 예외 모두;
    }

    *) 어쩔 수 없이 예외처리를 해야하는 경우
    -> 메서드가 throws Exception을 하는 경우

(4) 예외 출력 방법
    e.getMessage() : 오류의 기본적인 내용을 문자열로
    e.toString() : 오류의 조금 자세한 내용을 문자열로
    e.printStackTrace() : 오류의 상세 정보 출력

 

☆ Code

 

★ ExceptionTest

public class ExceptionTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Calculator c = new Calculator();
		c.setOperand(100, 27);
		c.divide1();
		
		c.setOperand(100, 0);
		// c.divide1();  // 0 나누기에 대한 대비가 안되어있어 프로그램 예외 종료
		c.divide2();
		
		try {
			c.divide3();
		}
		catch(Exception e) { e.printStackTrace(); }
		
		c.setOperand(100000, 0);
		try {
			c.divide4();
		}
		catch(Exception e) { e.printStackTrace(); }
		
		System.out.println("프로그램 완벽 종료");
	}
	
	void test() throws Exception {
		Calculator c = new Calculator();
		c.divide3();
	}

}

class Calculator {
	int left, right;
	
	public void setOperand(int left, int right) {
		this.left = left;
		this.right = right;
	}
	
	// 무대비
	public void divide1() {
		System.out.println("[divide()] " + left/right);
	}
	
	// 완벽한 예외 대비
	public void divide2() {
		try {
			System.out.println("[divide()] " + left/right);
		}
		catch(ArithmeticException e) {
			System.out.println("[divide()] 아리스메틱 오류 발생!");
			System.out.println("[divide()][B001] 오류 데이터 : " + left + ", " + right);
			System.out.println("[divide()] 집에 가");
			System.out.println(e.getMessage());
			System.out.println(e.toString());
			e.printStackTrace();
		}
	}
	
	// 예고 또는 경고
	public void divide3() throws Exception {
		System.out.println("[divide()] " + left/right);
	}
	
	// 사용자(개발자, 나)가 예외를 강제로 발생시키는 메서드
	public void divide4() throws Exception {
		if(left >= 10000)  // left가 10000 이상인 경우 나누기를 하고 싶지 않다면?
			throw new Exception("10000 이상 입력하셨습니다.");
		
		System.out.println("[divide()] " + left/right);
	}
}

 

★ MyExceptionTest

public class MyExceptionTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			// sendReceipt(400000000);
			// sendReceipt(300);
			sendReceipt(200000);
		}
		catch(Exception e) {
			e.printStackTrace();
			
			try {
			}
			catch(Exception e2) { e2.printStackTrace(); }
		}
		finally {
			System.out.println("[finally] 오류나던지 말던지 나는 수행해라");
		}
		
		System.out.println("[회계 프로그램] 정상 종료");
	}

	public static void sendReceipt(int amt) throws MyException {
		if(amt > 100000000)
			throw new MyException("[B001] 과도한 청구금액");
		else if(amt < 1000)
			throw new MyException("[B002] 금액 " + amt + "원은 니 돈주고 사먹어");
		
		System.out.println("[sendReceipt()] " + amt + "원 정상처리");
	}
}

class MyException extends Exception {
	MyException(String msg){
		super(msg);
		System.out.println("[MyException] 경찰서 고발");
		System.out.println("[MyException] 메시지 로그 기록");
		System.out.println("[MyException] 모든 전원 오프");
		System.out.println("[MyException] 전원 계약 해지");
		System.out.println("[MyException] 관련자 모두 무급 출근");
		System.out.println("[MyException] 사장님에게 보고");
	}
}

'JAVA' 카테고리의 다른 글

JAVA 제네릭  (0) 2024.11.17
JAVA 컬렉션 프레임워크  (1) 2024.11.16
JAVA base class  (3) 2024.11.15
JAVA 인터페이스  (2) 2024.11.15
JAVA string class  (0) 2024.11.15