본문으로 바로가기

예외

category onYouTube/Java 2021. 3. 26. 14:17

  try 
            예외의 발생이 예상되는 로직
  } catch (예외클래스 인스턴스) {
            예외가 발생했을 때 실행되는 로직
  }

 

public void divide() {

        try {
            System.out.print("계산결과는 ");
            System.out.print(this.left/this.right);
            System.out.print(" 입니다.");         
        } catch(Exception e) {
            System.out.println("오류가 발생했습니다 : " + e.getMessage());
        }
}

 

  • getMessage( ) : 에러의 원인을 간단하게 출력
  • toString( ) : 에러의 예외에 대한 내용과 원인을 출력
  • printStackTrace( ) : 에러의 발생지를 찾아서 단계별로 에러를 출력
System.out.println(e.getMessage());
System.out.println(e.toString());
e.printStackTrace();

 

  • try 안에서 예외가 발생하면 남아있는 try 구문은 건너뛰고, 바로 catch가 발생
  • 같은 try 구문에서 다양한 예외가 발생할 수 있음
try {
	System.out.println(arr[first] / arr[second]);
} catch(ArrayIndexOutOfBoundsException e){
	System.out.println("ArrayIndexOutOfBoundsException");
} catch(ArithmeticException e){
	System.out.println("ArithmeticException");
	System.out.println("Exception");
}

 

  try {
            예외의 발생이 예상되는 로직
  } catch (예외클래스 인스턴스) {
            예외가 발생했을 때 실행되는 로직
  } finally {
            예외 여부와 관계 없이 실행되는 로직
  }

 

  • throws : 다음 사용자에게 예외를 전가
class B {

	void run() throws IOException, FileNotFoundException {
    	
        ...
    }
}



class C {
	
    void run() {
    
    	B b = new B();
        
        try {
        	b.run();
        } catch (FileNotFoundException e) {
        	e.printStackTrace();
        } catch (IOException e) {
        	e.printStackTrace();
        }
        // 예외를 c.run()에게 전가
    }
}
class B {

	void run() throws IOException, FileNotFoundException {
    // IOException에 FileNotFound가 포함되어 있기 때문에, FileNotFound는 지워도 됨
    	
        ...
    }
}



class C {
	
    void run() throws IOException, FileNotFoundException {
    
    B b = new B();
    b.run();
}


public class ThrowExceptionDemo {
	
    public static void main(String[] args) {
    
    	C c = new C();
        
        try {
        	c.run();
		} catch (FileNotFoundException e) {
			System.out.println("out.txt 파일은 설정 파일입니다. 이 파일이 프로젝트 루트 디렉토리에 존재해야 합니다.");
			// out.txt 파일을 찾을 수 없는 상황은 B.run() 입장에서 처리할 수 없는 일이고, 애플리케이션 사용자가 처리할 수 있는 문제기 때문에 애플리케이션의 진입점인 main 메소드에게 전가
		} catch (IOException e) {
			e.printStackTrace();
		}
		// 예외를 main 메소드에게 전가
	}
}

 

  • IllegalArgumentException : 매개변수가 의도하지 않은 상황을 유발시킬 때
  • IllegalStateException : 메소드를 호출하기 위한 상태가 아닐 때
  • NullPointerException : 매개 변수 값이 null 일 때
  • IndexOutOfBoundsException : 인덱스 매개 변수 값이 범위를 벗어날 때
  • ArithmeticException : 산술적인 연산에 오류가 있을 때

 

import java.io.IOException;

class E {

	void throwArithmeticException() {
    
		throw new ArithmeticException();
	}
    
    
	void throwIOException(){
    
		throw new IOException();
		// 발생한 예외에 대해서 특별한 처리를 하지 않아서 에러가 발생
		// try-catch 구문을 정의하거나, 이 API를 사용하는 사용자에게 throw
	}
}

 

  • getMessage( ), printStackTrace( ), toString( ) 메소드들은
    exception 클래스들의 공통된 조상인 throwable 클래스에 기본적으로 정의가 되어 있음
  • exception의 취지에 따라 다양한 형태의 상속 구조를 가짐
  • throwable 클래스는 공통적인 인터페이스를 제공함
  • throwable 클래스의 하위 클래스만
    예외의 정보를 담고 있는 클래스로 인스턴스화 되어 throw 될 수 있음

 

try {
	System.out.println(arr[first / arr[second]);
} catch(ArrayIndexOutOfBoundsException e) {
	System.out.println("ArrayIndexOutOfBoundsException");
} catch(ArithmeticException e) {
	System.out.println("ArithmeticException");
} catch(Exception e) {
	System.out.println("Exception");
}
// Exception e가 제일 상위 클래스이기 때문에, 마지막에 위치함

 

  • Error에는 메무리 부족 등이 포함되고, 이는 하드웨어 업그레이드 등으로 해결해야 함
  • RuntimeException의 하위 클래스가 아니면, 반드시 try-catch 구문을 정의하거나 throws로 예외를 전가해야 함
    (RuntimeException의 하위 클래스이면, uncheckedException)
  • "표준 예외" : 자바가 기본적으로 제공하는 예외

 

  • 예외를 만들 때는 checked인지 unchecked인지 정해야 함

"checked"

  • 예외가 발생했을 때, API의 사용자가 예외 상황에서 프로그램적으로 복구할 수 있는 경우
    (즉, 상황을 개선할 수 있는 경우)
  • ex) NoFileFoundException
  • API를 사용하는 쪽에서 예외처리를 하도록 강제함
  • 상위 클래스에 RuntimeException이 있으면 안됨

"unchecked" 

  • 상황을 개선할 수 없거나, 프로그램을 종료시키는게 나을 경우
  • ex) ArithmeticException
  • 상위 클래스에 RuntimeException이 있어야 함

 

class DivideException extends Exception { // 에러
// Exception은 checkedException이므로 try-catch 구문을 정의하거나 throws로 예외를 전가해야 하기 때문에 에러가 발생함
// DivideException extends ArithmeticException은 에러가 발생하지 않음

	DivideException() {
    
		super();
	}


	DivideException(String message) {
    
		super(message);
	}
}



class Calculator {

	int left, right;


	public void setOperands(int left, int right) {
    
		this.left = left;
		this.right = right;
	}
    
    
	public void divide() {
    
		if(right == 0) {
        
			throw new DivideException("0으로 나눌 수 없습니다.");
		}
        
		System.out.print(this.left/this.right);
	}
}

'onYouTube > Java' 카테고리의 다른 글

상수와 enum  (0) 2021.03.27
Object 클래스  (0) 2021.03.26
다형성 (Polymorphism)  (0) 2021.03.24
인터페이스 (Interface)  (0) 2021.03.24
final  (0) 2021.03.24