예외와 예외처리란?
•
예외 : 단순히 우리가 잘못입력해서 나오는 문법오류가 아닌 실행 중간에 발생하는 정상적이지 않은 상황을 말한다
•
예외처리 : 이 정상적이지 않은 상황이 일어나면 프로그램이 중단되기때문에 프로그램이 중단되지 않도록 미리 대처하는 것을 말한다
try, catch, finally
try-catch문은 예외를 처리하기 위한 문법이다
public class ExceptionCase {
public static void main(String[] args) {
System.out.println("Hello~");
System.out.println(1/0);
System.out.println("Good bye~~!");
}
}
Java
복사
만약 이러한 코드가 있다고 보자
이 코드를 실행시켜보면 Good bye~라는 문자가 뜨지 않고 에러가 일어난다
이유는 1/0이 불능이기 때문이다
이러한 상황을 예외라고 한다
그러면 여기서 예외처리를 해보면
public class ExceptionCase {
public static void main(String[] args) {
System.out.println("Hello~");
try {
System.out.println(1/0);
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
System.out.println("Good bye~~!");
}
}
Java
복사
이렇게 코드가 들어갈 수 있다
try에는 예외가 일어날거같은 코드를 넣고
만약 예외가 일어나면 catch로 가게된다
그 다음 Good bye~가 출력되게 된다
Exception
Exception은 어떤 에러인지 확인하기위해 java에서 제공하는 클래스이다
이 클래스를 이용해 어떤 에러인지 확인이 가능하다
하지만 여기에서 아까 1/0에러에서나온 결과를 넣어보았다
...
catch(ArithmeticException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
...
Java
복사
이렇게 넣었는데 정상적으로 동작한다.
이유는 Exception이 ArithmeticException의 부모클래스이고
다형성이기때문이디
finally
finally는 try-catch와 상관없이 무조건 실행되는 코드블럭이다
catch는 예외가 일어날 경우에만 실행되었지만 finally는 무조건 실행이된다
public class ExceptionCase {
public static void main(String[] args) {
System.out.println("Hello~");
try {
System.out.println(1/0);
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
} finally {
System.out.println("finally!!");
}
System.out.println("Good bye~~!");
}
}
Java
복사
throws
try-catch와 다른 예외처리 방법이다
이름 그대로 던져버린다는 뜻인데
던지는것을 자신이 호출한 상위 메서드에게 예외처리를 던져버린다
public static void main(String[] args) {
try {
md1();
} catch(IOException e) {
e.printStackTrace();
}
}
public static void md1() throws IOException {
md2();
}
public static void md2() throws IOException {
BufferedWriter writer = null;
writer = Files.newBufferedWriter(file); // IOException 발생 가능
writer.write('A');
writer.write('Z');
if(writer != null)
writer.close();
}
Java
복사
이 코드를 살펴보면 먼저 try에서 md1메서드를 호출하고있다.
그래서 md1으로 가보게되면 md2메서드를 호출하고있다.
그렇게 md2메서드를 가보게되면 코드들이 있는데
이 코드들은 전부 예외가 발생할 수 있는 코드들이다.
그래서 여기에는 try-catch문이 없기때문에 예외가 발생하면 그대로 에러가 나게된다
하지만 throws를 통해서 예외처리를 해주었다
그래서 만약 md2에서 예외가 일어날경우 자신을 호출한 상위 메서드 md1에게 예외처리를 던져버리게 되고
그 md1도 자신을 호출한 main의 try에게 예외처리를 던저버리게 된다.
그렇게 try안에서 예외가 일어났기때문에 catch문으로 예외를 잡게된다
main메서드 옆에 throws
만약 main함수 옆에 throws를 넣으면 어떻게 될까
public static void main(String[] args) throws Exception {
...
}
Java
복사
이렇게 작성을 하게되면 main안에서 일어나는 예외들을 전부 main을 호출한 JVM에게 던져버리겠다는것이다
이렇게되면 JVM은 콘솔에 예외내용을 출력하게된다
하지만 이러한 방법은 예외내용을 처리하지 않는다는 뜻이기때문에 테스트용말고는 사용하지 말자
Checked Exception, Unchecked Exception
Exception에는 Checked Exception, Unchecked Exception두 가지 종류가 있다
•
Checked Exception : 반드시 예외처리를 해야된다
•
•
•
Unchecked Exception : 예외처리를 하지 않아도 된다
◦
런타임중에 일어난 예외이다
◦
ex) ArrayIndexOutOfBoundsException, NullPointerException