예외처리
예외처리의 필요성
예외처리 문법
try {
//문제가 발생할 수 있는 로직을 기술한다.
} catch(Exception e) {
// try{}안에 문제가 발생했을때 대처방안을 기술한다.
}
예외처리 예제
package sutdy.java.ex18_Exception;
public class MainClass {
public static void main(String[] args) {
int i = 10;
int j = 0;
System.out.println(i * j);
try { //문제가 발생할 수 있는 로직을 try{} 처리
System.out.println(i / j);
} catch (Exception e) { // 문제가 발생할 경우 처리하는 부분
System.out.println(e.getMessage()); //어떠한 이유로 에러가 생기는지 알려주는 메세지
e.printStackTrace(); //메세지를 자세하게 보고 싶을때 사용
}
System.out.println(i + j);
System.out.println(i - j);
}
}
결과값
0
/ by zero
10
10
java.lang.ArithmeticException: / by zero //e.printStackTrace();
at sutdy.java.ex18_Exception.MainClass.main(MainClass.java:12)
끝내 실행한다 (finally)
finally 은 try ~ catch를 이용할 경우 try{}에서 문제가 발생하면 catch문이 실행됩니다.
finally문은 try와 catch문의 영향 없이 무조건 샐행이 된다
finally 예제
int[] arr = {10,20,30};
try {
System.out.println("test : " + arr[2]);
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
System.out.println("무조건 실행된다.");
}
결과값
test : 30 무조건 실행된다.
위결과값을 보았을때 try{}부분에 걸려도 finally은 실행이 되고 catch{}부분에 걸려도 finally 는 실행이 무조건 된다. 결과적으로 무조건 실행이되야하는 부분은 finally에 코드를 사용하면 된다.
예외처리문법 (throws)
throws란 예외를 발생시킨 호출하는 부분으로 예외를 보내버리는 방식이다.
예외처리 예제
package sutdy.java.ex18_Exception;
public class TrowsExClass {
public TrowsExClass() {
actionC();
}
private void actionA() throws Exception {
System.out.println("첫번째 : actionA");
int[] i = {10,20,30,40};
System.out.println(i[4]);
}
private void actionB() {
System.out.println("첫번째 : actionB");
try {
actionA();
} catch (Exception e) {
System.out.println("여기서 예외처리를 하겠습니다.");
System.out.println(e.getMessage());
e.printStackTrace();
}
System.out.println("두번째 : actionB");
}
private void actionC () {
System.out.println("첫번째 : actionC");
actionB();
System.out.println("두번째 : actionC");
}
}
코드설명
생성자 부분에서 actionC(); 를 호출한다. 그럼 밑에 있는 actionC() 메서드에 첫번째 콘솔을 실행한후 그 밑에 actionB() 메서드를 호출한다. actionB()메서드 에서 첫번째 콘솔을 찍고 그다음에 try 부분에 진입을 하는데 try{}에서 actionA를 호출한다. actionA에서 첫번째 콘솔을 찍고, 배열을 만든다음에 콘솔을 찍었는데 배열 i의 4번째 값이 없다. 그럼 actionA를 호출한곳인 actionB() 메서드로 돌아가서 catch부분에 진입한다. 예외처리를 하고 그다음 콘솔인 두번째 actionB를 실행한후에 actionC메서드에 actionB(); 호출부분이 끝나기 때문에 actionC();메서드에 두번째 콘솔을 찍는것이다.
결과값
첫번째 : actionB 첫번째 : actionA 여기서 예외처리를 하겠습니다. 4 두번째 : actionB 두번째 : actionC java.lang.ArrayIndexOutOfBoundsException: 4 at sutdy.java.ex18_Exception.TrowsExClass.actionA(TrowsExClass.java:14) at sutdy.java.ex18_Exception.TrowsExClass.actionB(TrowsExClass.java:22) at sutdy.java.ex18_Exception.TrowsExClass.actionC(TrowsExClass.java:34) at sutdy.java.ex18_Exception.TrowsExClass.<init>(TrowsExClass.java:6) at sutdy.java.ex18_Exception.MainClass.main(MainClass.java:7) ```
자주보는 예외들