쉽게 배우는 JAVA 2-5(예외1)
"이 글은 글쓴이가 부스트 코스의 쉽게 배우는 JAVA2를 통해 배운 점을 적는 공간입니다."
Exception
정수를 0으로 나누는 예외인 ArithmeticException, 배열의 빈 공간에서 값을 출력하는 예외 ArrayIndexOutBoundsException 등 JAVA에서는 다양한 예외가 존재합니다. 이러한 예외들은 프로그램을
불완전하게 만드는 요소이기 때문에,Exception 클래스를 통해 반드시 따로 처리를 해줘야 합니다.
try catch
public class ExceptionClass {
public static void main(String[] args) {
System.out.println(1);
int[] scores = {10,20,30};
try {
System.out.println(2);
// System.out.println(scores[3]);
System.out.println(3); //실행되지 않는 코드 try 아래전부
System.out.println(2/0);
System.out.println(4);
} catch(ArithmeticException e) {
System.out.println("ArithmeticException" + e.getMessage());
e.printStackTrace();
} catch(Exception e) {
System.out.println("Exception");
}
System.out.println(5);
}
}
위와 같이 예외가 생기는 문장을 try문으로 감싸주고 예외가 발생했을 때 어떻게 처리할지를 catch문에 작성해주면 된다.
try문을 위에서 아래로 실행하다가 예외를 만나면 바로 catch문이 실행되기 때문에 예외가 발생한 아래의 코드들은 실행되지 않는다. 예를 들어,
System.out.println(scores[3]);가 만약 예외처리가 되었다고 하면 아래의
System.out.println(3);
System.out.println(2/0);
System.out.println(4);는 실행되지 않고
catch(Exception e) {
System.out.println("Exception"); } 문이 바로실행되는 것이다.
catch의 괄호에는 발생하는 예외 값(ArithmeticException, ArrayIndexOutBoundsException 등)을 넣어주면 된다.
throw Exception
try catch문은 메소드를 만든 사람이 직접 예외를 처리하는 것이라면 throw는 메소드를 사용할 사용자에게 예외를 처리하도록 떠넘기는 것입니다. 아래의 코드에서 close문을 따로 명시하지 않았지만 컴파일 됩니다. 그 이유는 throws를 통해 IOException을 메소드 사용자에게 떠넘겼기 때문입니다.
import java.io.FileWriter;
import java.io.IOException;
public class MyException {
public static void main(String[] args) throws IOException {
FileWriter f = new FileWriter("data.txt");
}
}
Exception Class
여기서 주의할 점은 Exception클래스도 상속관계를 가지므로 발생하는 예외 값이 자식이라면 부모 클래스를 사용해도 된다.예를 들어, System.out.println(scores[3]);의 예외 값인 ArrayIndexOutBoundsException은 Exception의 자식이기 때문에 catch(Exception e)으로도 예외처리가 가능한 것이다.
Exception 클래스의 상속 관계는 아래의 링크에서 알아볼 수 있다.
https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html
Exception (Java Platform SE 8 )
protected Exception(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) Constructs a new exception with the specified detail message, cause, suppression enabled or disabled, and writable stack trace enabled or disabl
docs.oracle.com
예외의 순서
그럼 위 코드에서 System.out.println(2/0)의 예외 값인 ArithmeticException은
} catch(ArithmeticException e) {
System.out.println("ArithmeticException" + e.getMessage());
e.printStackTrace();
} catch(Exception e) {
System.out.println("Exception");
}
둘 중 어느 것으로 실행될까? 바로 ArithmeticException으로 실행되어 진다. 그 이유는 ArithmeticException의 값이 Exception보다 위에 있기 때문이다. catch문에 작동원리는 위에서 아래로 순회하다가 알맞은 값이 있으면 그 catch
문으로 들어간다.