[JAVA] Exception - 3

Coastby·2022년 8월 9일
0

JAVA

목록 보기
24/33

예외-3

○ throw

우리가 만든 예외를 사용자에게 던지는 방법

원하는 지점에 예외상황을 만들어서 오류를 만들어 낼 수 있다.

throw는 예외를 발생시키는 명령어이다. throw 뒤에는 예외 정보를 가지고 있는 예외 클래스가 위치한다.

public void divide(){
        if(this.right == 0){
						//this.right에 0이 들어오면 프로그램이 중지되면서 예외상황으로 ""안의 문구가 나타난다.
            throw new ArithmeticException("0으로 나누는 것은 허용되지 않습니다.");
        }
        try {

위의 메소드를 사용하는 메소드에서 try-catch를 이용하여 예외를 잡아낼 수 있다. 자바가상머신은 위의 예외클래스를 기준으로 어떤 catch 구문을 실행할 것인지를 결정한다. 또 실행되는 catch 구문에서는 예외클래스를 통해서 예외 상황의 원인에 대한 다양한 정보를 얻을 수 있다. 이 정보를 바탕으로 문제를 해결하게 된다.

public class CalculatorDemo {
    public static void main(String[] args) {
        Calculator c1 = new Calculator();
        c1.setOprands(10, 0);
				try{
		        c1.divide();
				} catch (ArithmethicException e){
						System.out.println(e.getMessage());
				}
    }
}

//result
0으로 나누는 것은 허용되지 않습니다.

자바에서는 기본적으로 제공하는 예외 (표준 예외 클래스)가 있다. 이러한 예외들은 자바 가상 머신이 사용하기도 하고 응용 프로그램 개발자가 사용할 수도 있다. 클래스 Exception을 자바 API 문서에서 찾아보고 하위 클래스로 어떤 것들이 있는지 살펴볼 수도 있다. 아래는 주요 Exception 리스트들이다. (Effective java p.388)

○ Throwable / Exception

: 모든 예외들의 부모

중요한 예외 클래스들은 아래와 같다.

  • Throwable
  • Error
  • Exception
  • RuntimeException

상속 관계를 그림으로 나타내면 아래와 같다.

Throwable

예외 클래스들의 공통된 조상이다. 모든 예외 클래스들이 가지고 있는 공통된 메소드를 정의하고 있다. 중요한 역할을 하지만 이 클래스를 직접 사용하지는 않기 때문에 우리에게는 중요하지 않다.

Error

애플리케이션의 문제가 아니라 자바 가상 머신 자체적인 문제이기 때문에 애플리케이션이 할 수 있는 것은 없다. 애플리케이션을 구동시키기에는 메모리가 부족한 경우가 이에 속한다. 애플리케이션 개발자가 할 수 있는 것은 없기 때문에 따로 예외처리를 하지 말고 그냥 에러로 인해서 동작이 중단되도록 내버려둔다. 대신 자신의 애플리케이션이 메모리를 과도하게 사용하고 있다면 로직을 변경하거나 자바 가상머신에서 사용하는 메모리의 제한을 변경하는 등의 대응을 한다.

Exception

  • unchecked exception : 부모에 RuntimeException이 있다. 예외처리를 해도되고 안 해도 된다.
  • checked exception : 부모에 RuntimeException이 없다. 반드시 try-catch나 thorws를 통해서 예외처리가 필요하다.

exception을 만들어서 사용할 때 이 둘을 구분해서 만들어야 한다.

○ 나만의 예외 만들기

  • 최대한 표준 예외 클래스를 사용하는 것이 좋다. 표준 예외 클래스로도 많은 예외 상황을 표현할 수 있다. 그렇지 못할 경우에 직접 예외를 만든다.
  • checked or unchecked?
    • checked : API 쪽에서 예외를 던졌을 때 API 사용자 쪽에서 예외 상황을 복구할 수 있다면 checked 예외를 사용한다. 사용자에게 문제를 해결할 기회를 주는 것이면서 예외 처리를 강제하는 것이다. 하지만 사용자를 피곤하게 할 수 있기 때문에 남발하지 않는 것이 좋다. 예) 파일을 못 찾는 경우 (FileNotFoundException)
    • unchecked : 사용자가 API의 사용방법을 어겨서 발생하는 문제거나 예외 상황이 이미 발생한 시점에서 프로그램을 종료하는 것이 덜 위험할 때 사용한다. 예) 0으로 나누는 경우 등
package org.opentutorials.javatutorials.Exceptions;

class DivideException extends RuntimeException {
	public int right;
	public int left;
	
	DivideException () {
		super();
	}
	DivideException (String msg, int left, int right) {
		super(msg);
		this.left = left;
		this.right = right;
	}
}

class Calculator{
    int left, right;
    public void setOprands(int left, int right){        
        this.left = left;
        this.right = right;
    }
    public void divide(){
        if(this.right == 0){
            throw new DivideException("0으로 나누는 것은 허용되지 않습니다.", this.left, this.right);
        }
        System.out.print(this.left/this.right);
    }
}
public class CalculatorDemo {
    public static void main(String[] args) {
        Calculator c1 = new Calculator();
        c1.setOprands(10, 0);
        try {
        	c1.divide();
        } catch (DivideException e){
        	System.out.println("두 번째 숫자로 " + e.right + "를 입력하셨습니다.");
        	System.out.println(e.getMessage());
        }
    }
}

//result
두 번째 숫자로 0를 입력하셨습니다.
0으로 나누는 것은 허용되지 않습니다.
  • 예외클래스를 만들고 생성자도 만들어준다.
class DivideException extends Exception {
    DivideException(){
        super();
    }
    DivideException(String message){
        super(message);
    }
}
  • 예외클래스를 직접 만들면 위처럼 변수를 추가하는 등 다양하게 활용할 수 있다.
profile
훈이야 화이팅

0개의 댓글