예외처리

조윤후·2021년 7월 12일

예외처리

예외처리의 필요성

  • 어떠한 이유로 작동하지않는다면 어느한 부분에서도 예외가 발생하더라도 계속해서 프로그램이 동작하도록 하는데 목적이 있다.

예외처리 문법

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)

finallytry ~ 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)
    ```

자주보는 예외들

  • ArrayIndexOutOfBoundsException : 배열사용시 존재하지 않는 index값을 호출하면 발생
  • NullPoninterExcption : 존재하지 않는 객체를 바라볼때 발생
  • NumberFormatExcption : 문자를 숫자로 변경할때 처리할때 발생 (숫자를 넣었을때 빈공간이 생겨도 발생)
profile
공부하며 예제풀이 정리

0개의 댓글