Java의 exception

zihooy·2023년 5월 4일
0

Java Programming

목록 보기
11/21
post-thumbnail

Java의 기본 개념 중 exception에 대해 알아보자.

🏹 Exception의 목적

Exception은 언제 활용할까?
물론 예외 처리를 확실히하면 좋지만, 본래의 목적은 코드 실행 중에 에러가 나더라도, 프로그램을 중단시키지 않고 끝까지 실행하기 위함이다.

e.printStackTrace();을 통해 그 내용을 자세하게 확인할 수 있다.

public class hello {
	public static void main(String[] args) {
		System.out.println(1);
		int a = 4, b = 0;

		try {
			System.out.println(a/b);
		} catch (Exception e) {
			System.out.println(3);
//			e.printStackTrace();
		}
		System.out.println(2);
		int[] ar = {1, 2, 3};
		try {
			ar[10] = 10;
		} catch (Exception e) {
//			e.printStackTrace();
		}
		System.out.println(4);
		
		String str = "호랑이";
		System.out.println(str.length());
		str = null; //이제부터는 객체가 아니다 
		//NullPointerException
		try {
			System.out.println(str.length());
		} catch (Exception e) {
		}
		System.out.println(5);
	}
}

🏹 Exception의 목적

Exception 중 Unhandled Exception이 있다.
이것은 try-catch를 활용하여 해결할 수 있다.

다음의 예시 중 class Tiger의 f1()과 f2()를 자세히 보면,
f1()은 메소드 안에서 try-catch문을 사용한 반면
f2()는 throws Exception을 통해
f2()가 error를 catch하지 않고 함수를 호출한 부분에서 catch하도록 한다.

따라서 main 함수 안에서
t.f2();를 호출하면 이 부분에서 catch를 하도록 책임을 미뤘는데, catch를 하지 않았으므로 error가 발생한다.
따라서 try { t.f2(); } catch (Exception e) {} 이처럼 catch를 걸어주어야 한다.

만약 f2()를 호출하는 부분에서 catch를 활용하고 싶지 않다면, 해당 클래스 전체에 throws Exception을 사용하면 해결되긴 한다. 그러나 이 방법은 책임을 계속해서 미루는 것이므로 추천하지 않는다 !

class Tiger {
	void f1() {
		try {
			throw new Exception();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	void f2() throws Exception{ //f2가 catch를 하지 않고, 함수를 호출한 부분에서 catch하도록 
		throw new Exception();
	}
}
public class hello {
	public static void main(String[] args) {
		System.out.println(1);
		Tiger t = new Tiger();
		t.f1();
		System.out.println(2);
		
		//Unhandled Exception -> Try-Catch 로 해결 
		//t.f2(); // 함수를 호출하는 부분에서 catch해야 하는데, 하지 않아서 error
		
		try { t.f2(); } catch (Exception e) {}
		
		//t.f2(); // 함수를 호출하는 부분에서 catch해야 하는데, 하지 않아서 error
		// 이럴 때는 main에 throws Exception에 걸면 되긴 함 
		
		//Unhandled Exception -> Try-Catch 로 해결 
		//Thread.sleep(3000);	//ms
		
		try {Thread.sleep(3000);} catch (Exception e) {}
		
		System.out.println(3);
		
		for (int i = 0; i < 4; i++) {
			try {Thread.sleep(1000);} catch (Exception e) {}
			System.out.println("Tag : " + i);
		}
	}
}

🏹 Finally의 활용

Finally는, 어떤 경우에도(exception이 발생하더라도) 코드가 실행되도록 한다.
어떤 경우에 이를 활용할까?

class Tiger {
	void f1() {
		try {
			if(3 > 2) {
				System.out.println("test1");
			} else {
				System.out.println("test2");
				return; //함수 중단
				//finally를 활용하면 함수가 중단되더라도 그 다음을 실행할 수 있다. 
			}
		} catch (Exception e) {
		} finally {
			System.out.println("test3");	
		}
	}
}
public class hello {
	public static void main(String[] args) {
		System.out.println(1);
		try {
			System.out.println(2);
			System.out.println(4/0);	
		} catch (Exception e ) {
			System.out.println(3);
		} finally {	//어떤 경우에도 실행
			System.out.println(4);	
		}
		//finally의 목적은 ? return이후에도 코드 실행 가능 !
		Tiger t = new Tiger();
		t.f1();
	}
}

위의 예시를 보면 return문 이후에도 코드를 실행시키고 싶을 때 finally를 활용할 수 있다는 것을 알 수 있다. 왜냐하면 finally는 어떤 경우에도 실행되기 때문이다.

profile
thisIsZihooLog

0개의 댓글