blues_log
article thumbnail
Published 2023. 6. 8. 15:48
[Java] 예외 Java/Java 정리

예외(Exception)의 문법

  • 예외는 프로그램을 만든 프로그래머가 상정한 정상적인 처리에서 벗어나는 경우에 이를 처리하기 위한 방법이다.
  • try...catch는 예외에서 핵심적인 역할을 담당하는 문법적인 요소이고, 형식은 다음과 같다.
try {
    예외의 발생이 예상되는 로직
} catch (예외클래스 인스턴스) {
    예외가 발생했을 때 실행되는 로직
}
  • try 안에는 예외 상황이 발생할 것으로 예상되는 로직을 위치시킨다.
  • catch 안에는 예외가 발생했을 때 뒷수습을 하기 위한 로직이 위치한다.
  • 프래그램이 실행될 때, try 부분에서 오류가 발생하는 순간 실행이 멈추고 catch에 있는 로직이 실행된다.

뒷수습의 방법

  • 뒷수습을 하는 인스턴스 메소드에는 대표적으로 .getMessage(), .toString(), .printStackTrace()가 있다.
class Calculator{
    int left, right;
    public void setOprands(int left, int right){
        this.left = left;
        this.right = right;
    }
    public void divide(){
        try {
            System.out.print("계산결과는 ");
            System.out.print(this.left/this.right);
            System.out.print(" 입니다.");
        } catch(Exception e){
            System.out.println("\n\ne.getMessage()\n"+e.getMessage());
            System.out.println("\n\ne.toString()\n"+e.toString());
            System.out.println("\n\ne.printStackTrace()");
            e.printStackTrace();
        }
    }
} 
public class CalculatorDemo {
    public static void main(String[] args) {
        Calculator c1 = new Calculator();
        c1.setOprands(10, 0);
        c1.divide();
    }
}

 

위의 코드의 계산 결과는 다음과 같다.

 

계산결과는 
 
e.getMessage()
/ by zero
 
 
e.toString()
java.lang.ArithmeticException: / by zero
 
 
e.printStackTrace()
java.lang.ArithmeticException: / by zero
    at org.opentutorials.javatutorials.exception.Calculator.divide(CalculatorDemo.java:11)
    at org.opentutorials.javatutorials.exception.CalculatorDemo.main(CalculatorDemo.java:25)

 

위에서 알 수 있는 사실은 다음과 같다.

  • getMessage() : 오류에 대한 기본적인 내용을 출력해준다.
  • toString() : getMessage()보다는 조금 더 자세하게 어떤 예외가 발생했는지 알려준다.
  • printStackTrace() : 모든 예외 결과를 화면에 출력해준다. 가장 자세한 예외 정보를 알려준다.

 


다중캐치

  • try 구문에서도 조건문의 else if처럼 여러 개의 catch를 사용할 수 있다. (중첩으로 사용할 수도 있음 !)
  • 즉 catch에서 예외의 종류에 따라서 처리하는 다음 코드와 같이 로직을 다르게 구성할 수 있다.
try {
	System.out.println(arr[first] / arr[second]);
} catch(ArrayIndexOutOfBoundsException e){
	System.out.println("ArrayIndexOutOfBoundsException"); //예외가 ArrayIndexOutOfBoundsException인 경우
} catch(ArithmeticException e){
	System.out.println("ArithmeticException"); //예외가 ArithmeticException인 경우
} catch(Exception e){
	System.out.println("Exception"); //예외가 위의 두 개를 제외한 다른 예외인 경우

 

 


 finally

  • finally는 try와 catch 뒤에 등장한다.
  • 문법은 다음과 같다.
try {
    예외의 발생이 예상되는 로직
} catch (예외클래스 인스턴스) {
    예외가 발생했을 때 실행되는 로직
} finally {
   예외 여부와 관계없이 실행되는 로직
}

 


throws

  • throw는 예외처리를 다음 사용자에게 넘기는 것이다. 예시는 다음과 같다.
class B{
    void run() throws IOException, FileNotFoundException{ //IOException, FileNotFoundException의 처리를 다음 사용자에게 넘기겠다는 의미 !
        BufferedReader bReader = null;
        String input = null;
        bReader = new BufferedReader(new FileReader("out.txt"));
        input = bReader.readLine();
        System.out.println(input);
    }
}

 


예외의 종류

  • 자바가 기본적으로 제공하는 대표적인 예외에는 다음과 같은 것들이 있다.
예외 사용해야 할 상황
IllegalArgumentException 매개변수가 의도하지 않은 상황을 유발시킬 때
IllegalStateException 메소드를 호출하기 위한 상태가 아닐 때
NullPointerException 매개 변수 값이 null 일 때
IndexOutOfBoundsException 인덱스 매개 변수 값이 범위를 벗어날 때
ArithmeticException 산술적인 연산에 오류가 있을 때

 

 


checked, unchecked 예외

  • checked 예외는 RuntimeException을 제외한 Exception의 하위 클래스들을 말한다.
  • unchecked 예외는 RuntimeException을 말한다.
  • checked 예외는 반드시 예외처리를 해야하고 unchecked 예외처리를 해도되고 안해도 무방하다.

 

대표적인 클래스 간의 상속관계 (Error는 unchecked 예외이다.)

 

  • Throwable 은 범 예외 클래스들의 공통된 조상이다. 모든 예외 클래스들이 가지고 있는 공통된 메소드를 정의하고 있다.
  • Error는 에플리케이션이 동작하는 가상머신에 문제가 생겼을 때 발생하는 예외다. 따라서 예외처리를 하지 말고 그냥 에러로 인해서 애플리케이션이 중단되도록 내버려둔다.

 

 


참고 : https://opentutorials.org/module/516/6226 (생활코딩 자바)

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

[Java] static  (0) 2023.06.09
[Java] 향상된 for 문  (0) 2023.06.08
[Java] 배열(Array)  (0) 2023.05.23
[Java] 반복문 - while 문  (0) 2023.05.18
[Java] 반복문 - for 문  (1) 2023.05.16