Day 38

ChangWoo·2023년 5월 13일
0

자바의 정석

목록 보기
38/71
post-thumbnail

ch 8-7,8 printStackTrace(),멀티 catch블럭

printStackTrace()와 getMessage()

printStackTrace() : 예외발생 당시의 호출스택(Call stack)에 있었던 메서드의 정보와 예외 메시지늘 화면에 출력한다.
getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.

try {
	...
    System.out.println(0/0); // 예외발생!!!
    ...
} catch (ArithmeticException ae) {
	ae.printStackTrace();
    System.out.println(ae.getMessage());
} catch (Exception e) {
	...
}
  • 예외발생 -> ArithmeticException 타입의 예외객체 생성 -> 객체에 발생한 예외에 대한 정보가 들어있다. -> printStackTrace() / getMessage() 메서드가 들어있다.
  • 참조변수의 타입과 예외의 타입이 일치하므로 catch블럭이 실행된다.(= 참조변수 ae에 ArithmeticException 타입의 객체의 주소값이 들어간다.)
  • 참조변수 ae의 유효범위(scope)는 catch블럭이다.

  • 1,2,3을 출력하고 예외가 발생
  • 예외객체가 생성되어서 catch블럭으로 간다.
  • catch블러과 타입이 일치하므로 pritStackTrace를 실행 (왜 예외가 발생했는지 알려준다.)

멀티 catch블럭

내용이 같은 catch블럭을 하나로 합친 것(JDK1.7부터)

try {
	...
} catch (ExceptionA e) {				try {
	e.printStackTrace();	내용동일		...
} catch (ExceptionB e2) {	-------->  	} catch (ExceptionA | ExceptionB e) {
	e2.printStackTrace();	중복제거				e.printStackTrace();
}										}
  • catch블럭이 2개 있는데, 내용이 동일.
  • 그래서, 중복제거 후 하나로 만들어준다.
try {
	...
    // } catch (ParentException | ChildException e) { // 에러! (부모/자식 관계는 X)
} catch (ParentException e) { // OK. 위의 라인과 의미상 동일
	e.printStackTrace();
}
try {
	...
} catch (ExceptionA | ExceptionB e) {
		e.methodA(); // 에러. ExceptionA에 선언된 methodA()는 호출불가
        if(e instanceof ExceptionA) {
        	 ExceptionA e1 = (ExceptionA)e;
             e1.methodA();	// OK. ExceptionA에 선언된 메서드 호출가능
    } else { // if(e instanceof ExceptionB)
    	...
  • ExceptionA와 ExceptionB의 공통멤버만 사용가능
  • 개인의 멤버를 사용하기 위해서는 if~else문을 사용하여 형변환을 해야 한다.

ch 8-9,10 예외 발생시키기, 체크드,언체크드 예외

예외 발생시키기

1.연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음
Exception e = new Exception("고의로 발생시켰음");
2.키워드 throw를 이용해서 예외를 발생시킨다.
throw e;

  • throw를 통해 예외를 발생시키고, catch블럭과 일치하는지 확인
  • 결과 - 에러 메시지 : 고의로 발생시켰음.
    java.lang.Exception: 고의로 발생시켰음.
    at Ex8_6.main(Ex8_6.java:4)
    프로그램이 정상 종료되었음.

chekced예외, unchecked예외

checked예외 : 컴파일러가 예외 처리 여부를 체크(예외 처리 필수) (Exception자손 / try-catch 필수)
unchecked예외 : 컴파일러가 예외 처리 여부를 체크 안함(예외 처리 선택)(RuntimeException 자손 / try-catch 선택)

  • Exception이 checked예외이므로 필수로 예외를 처리해야 하는데 안해서 컴파일 자체가 안된다.

  • RuntimeException은 unchecked예외이므로 예외처리가 선택이라 컴파일 OK다.
  • 하지만, RuntimeException이 발생한다.

checked예외와 unchecked예외 사용 이유

  • 만약에 RuntimeException에서 예외가 필수가 된다면, 참조변수가 있을 때, NullPointerException이 발생할 가능성이 크다.
  • 그리고 배열이 있을 때, IndexOutOfBoundsException이 발생할 가능성이 크다. (배열 범위를 벗어날 수 있기 때문에)
profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글