Java 예외 1 - 문법

별의개발자커비·2023년 2월 16일
0

Java

목록 보기
46/66
post-thumbnail

예외란?

  • 프로그램을 만든 프로그래머가 상정한 정상적인 처리에서 벗어나는 경우에 이를 처리하기 위한 방법

try...catch

class Calculator{
    int left, right;
    public void setOprands(int left, int right){
        this.left = left;
        this.right = right;
    }
    public void divide(){
			// 계산 결과 오류 발생: / by zero
			try{ // try { 예외 예측되는 로직 }
        System.out.print("계산결과는 ");
        System.out.print(this.left/this.right); 
        System.out.print(" 입니다.");
			} catch ( Exception e) { // 에러발생시 실행됨  
				// 매개변수(Exception e)로는 에러에 대한 정보를 담고있는 객체 
				// 데이터타입은 Exception이라는 클래스
				System.out.println("오류 발생: "+ e.getMessage()); 
				//Exception이라는 클래스 안에 .getMessage() 메소드가 포함되어있음
			}    
		}
} 
public class Main {
    public static void main(String[] args) {
        Calculator c1 = new Calculator();
        c1.setOprands(10, 0);// error: 10을 0으로 나누려고해서
        c1.divide();
    }
}

뒷수습

e.getMessage();

  • 오류에 대한 기본적인 내용을 출력해준다. 상세하지 않다.

e.toString()

// 실행결과
java.lang.ArithmeticException: / by zero 
  • e.toString()은 e.getMessage()보다 더 자세한 예외 정보를 제공한다. java.lang.ArithmeticException은 발생한 예외가 어떤 예외에 해당하는지에 대한 정보라고 지금을 생각하자. ArithmeticException 수학적인 계산의 과정에서 발생하는 예외상황을 의미한다. (우리는 어떤 숫자를 0으로 나누려고 하고 있다는 것을 상기하자)

e.printStackTrace()

  • 메소드 getMessage, toString과는 다르게 printStackTrace는 리턴값이 없다. 이 메소드를 호출하면 메소드가 내부적으로 예외 결과를 화면에 출력한다. 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();
        }
			System.out.println("end"); // 오류 발생시, catch 실행 후 catch 바깥의 로직도 이어서 실행됨
    }
}

class Main {

    public static void main(String[] args) {
        Calculator c1 = new Calculator();
        c1.setOprands(10, 0);
        c1.divide();
    }
}

다양한 예외들과 다중캐치

class A{
    private int[] arr = new int[3];
    A(){
        arr[0]=0;
        arr[1]=10;
        arr[2]=20;
    }
    public void z(int first, int second){
			try{
        System.out.println(arr[first] / arr[second]);
			}
			catch(ArithmeticException e){ // 예외 경우 1
				System.out.println("ArithmeticException e");
			}
			catch(ArrayIndexOutOfBoundsException e){ // 예외 경우 2
				System.out.println("ArrayIndexOutOfBoundsException e");
			}
			catch(Exception e){ // 위 두 catch에 해당안되는 건 다 이거로 처리 (마지막에 써야!)
				System.out.println("Exception");
			}
    }
}

class Main {

    public static void main(String[] args) {
        A a = new A();
        a.z(10, 0); // 배열 범위3를 넘어가는 경우
			  a.z(1, 0); // 0으로 나누려는 경우 (Math오류)
			  a.z(2, 1);


    }
}

finally

class A{
    private int[] arr = new int[3];
    A(){
        arr[0]=0;
        arr[1]=10;
        arr[2]=20;
    }
    public void z(int first, int second){
        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");
        } finally { // 매번 항상 실행
            System.out.println("finally");
        }
    }
}

class Main {

    public static void main(String[] args) {
        A a = new A();
        a.z(10, 0);
        a.z(1, 0);
        a.z(2, 1);
    }
}
  • 실행 결과

    	 ArrayIndexOutOfBoundsException
    	finally
    	ArithmeticException
    	finally
    	2
    	finally
  • 그럼 finally는 언제 사용하는 것일까? 어떤 작업의 경우는 예외와는 상관없이 반드시 끝내줘야 하는 작업이 있을 수 있다.

예를 들어 데이터베이스를 사용한다면 데이터베이스 서버에 접속해야 한다. 이때 데이터베이스 서버와 여러분이 작성한 에플리케이션은 서로 접속상태를 유지하게 되는데 데이터베이스를 제어하는 과정에서 예외가 발생해서 더 이상 후속 작업을 수행하는 것이 불가능한 경우가 있을 수 있다. 예외가 발생했다고 데이터베이스 접속을 끊지 않으면 데이터베이스와 연결 상태를 유지하게 되고 급기야 데이터베이스는 더 이상 접속을 수용할 수 없는 상태에 빠질 수 있다. 접속을 끊는 작업은 예외 발생여부와 상관없기 때문에 finally에서 처리하기에 좋은 작업이라고 할 수 있다. 말하자면 finally는 작업의 뒷정리를 담당한다고 볼 수 있다.

0개의 댓글