[JAVA] Exception - 1

Coastby·2022년 8월 9일
0

JAVA

목록 보기
22/33

예외-1

예외 (exception)란, 프로그램을 만든 프로그래머가 상정한 정상적인 처리에서 벗어나는 경우에 이를 처리하기 위한 방법이다.

나누기에서 0으로 나누려고 하면 Exception **in** thread "main" java.lang.ArithmeticException: / by zero 이란 오류가 발생한다.

이때, 0으로 나눌 것을 예상하여 이러한 오류가 났을 때 처리하기 위해 try-catch를 이용한다.

○ try-catch

catch() 안의 e는 변수이며, 데이터타입은 Exception이다. Exception은 기본적으로 자바에서 제공하는 클래스로 java.lang에 소속되어 있다. 예외가 발생하면 메소드를 호출하듯이 catch를 호출하면서 그 인자로 Exception 클래스의 인스턴스를 전달한다.

e.getMessage()는 자바가 전달한 e 인스턴스의 메소드 중 getMessage를 호출하는 코드인데, getMessage는 오류의 원인을 사람이 이해하기 쉬운 형태로 리턴하도록 약속되어 있다.

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());
        }
    }

○ 뒷수습

\n : enter

e.getMessage() : 예외 상황에 대한 아주 간단한 정보

e.toString() : 어떤 예외에 발생했는지 보다 자세하게

e.printStackTrace() : 에러 내용 전체를 보여준다.

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();
        }
    }

//result
계산결과는 
 
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)

○ 다양한 예외들 처리

👉 배열에 존재하지 않는 인덱스를 호출하였을 때 발생하는 오류

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10

👉 0으로 나누기를 할 대 발생하는 오류

Exception in thread "main" java.lang.ArithmeticException: / by zero

서로 다른 예외에 다른 로직을 실행하고 싶다면

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");
        }
}

반대로 catch(Exception e)이 가장 위로 올라가게 되면 밑에 경고가 나타난다. 자바 프로그램 자체에서 개발자의 실수라고 생각하기 때문에 컴파일러에서 에러를 발생시킨다. (Exception은 나머지 오류들을 모두 포함하고 있어서 아래에 있는 오류들을 잡는 코드가 필요없어지기 때문이다)

○ finally

예외와 상관없이 try 내의 구문이 실행되면 finally가 실행된다.

어떤 작업 (데이터베이스와의 접속 중지 등)은 예외와는 상관없이 반드시 수행이 되어야하는 작업이 있을 수 있다.

profile
훈이야 화이팅

0개의 댓글