예외처리

zooyeong·2023년 3월 24일
0

8주차

목록 보기
5/6
post-thumbnail

📌예외처리

💡오류의 종류

에러(Error)

  • 하드웨어의 잘못된 동작 또는 고장으로 인한 오류
  • 에러가 발생되면 프로그램 종료
  • 정상 실행 상태로 돌아갈 수 없음

예외(Exceotion)

  • 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인한 오류
  • 예외가 발생되면 프로그램 종료
  • 예외 처리 추가하면 정상 실행 상태로 돌아갈 수 있음

💡예외의 종류

  • 일반(컴파일 체크) 예외 : 예외 처리 코드가 없으면 컴파일 오류가 발생

  • 실행 예외(RuntimeException) : 예외 처리 코드를 생략하더라도 컴파일이 되는 예외. 경험 따라 예외 처리 코드 작성이 필요

💡예외 클래스

자바에서는 예외를 클래스를 통해 관리한다. 모든 클래스는 Object 클래스의 상속을 받으며, 이 중 모든 예외 클래스는 java.lang.Exception 클래스의 상속을 받는다.

일반 예외들로는 java.lang.ClassNotFoundException, java.lang.InterruptedException 등이 있다. 실행 예외로는 java.lang.RuntimeException이 있고 java.lang.NullPointerException, java.lang.NumberFormatException 등은 java.lang.RuntimeException 클래스의 상속을 받는다.

예외클래스계층도

Exception 클래스는 예외 클래스 중 최상위 클래스라는 점을 꼭 기억하자.

💡실행 예외

  1. NullPointerException : 객체 참조가 없는 상태(null 값 갖는 참조변수로 객체 접근 연산자인 .(도트)를 사용했을 때 발생)
  2. ArrayIndexOutOfBoundsException : 배열에서 인덱스 범위를 초과하여 사용할 경우 발생
  3. ClassCastException : 타입 변환이 되지 않을 경우 발생

💡예외 처리 코드

예외 발생 시 프로그램 종료를 막고, 정상 실행을 유지할 수 있도록 처리한다. 일반 예외는 반드시 작성해야 컴파일이 가능하다. 실행 예외는 컴파일러가 체크해주지 않으며 개발자 경험에 의해 작성한다. try-catch-finally 블록을 이용해 예외 처리 코드 작성이 가능하다.

try{
	//예외 발생 가능 코드
} catch(예외 클래스 e){
	//e라는 매개변수에 try의 예외 정보가 담긴다.
    //예외 처리
    //예외가 발생하면 실행
} finally{
	//무조건 실행
    //finally 부분은 없으면 안써도 됨
}

📖다중 catch
예외 별로 예외 처리 코드를 다르게 구현할 수 있다.

try{
	//예외 발생 가능 코드
    //err! -> java.lang.ArrayIndexOutOfBoundsException
    //err! -> java.lang.NumberFormatException
} catch(ArrayIndexOutOfBoundsException e){
	//예외 처리 1
} catch(NumberFormatException e){
	//예외 처리 2
} finally{
	//무조건 실행
}

📖catch 순서
다중 catch 작성 시 예외를 처리하는 순서는 위에서부터 차례로 내려오기 때문에 catch의 순서를 주의해서 작성해야 한다. 예외 클래스 중 최상위 클래스인 Exception을 가장 위에 작성하면 그 아래의 catch들로는 기회가 내려오지 않는다. 따라서 상위 클래스를 더 아래에 위치시켜야함을 유념하자.

↓ catch 순서 예시

catch순서오류예시

📖멀티(multi)catch
자바7부터는 하나의 catch 블록에서 여러 개의 예외 처리가 가능하다. 동일하게 처리하고 싶은 예외를 |로 연결한다.


🔥연습문제-캡처를 보고 출력결과 예상하기!!



예상)
test1 start
Test
test1 try end
test1 finally
test2 start
test2 catch
test2 finally
test3 start
test3 catch
test3 end
test4 start
test4 catch null
test4 end
test5 start
콘솔에 오류 메시지 출력된다.
test5 end
main end

출력 결과)

코드출력결과

-> test5 메소드는 try-catch-finally 예외처리코드가 없기 때문에 예외가 발생하면 콘솔에 오류 메시지를 출력하고 그 즉시 프로그램이 종료된다. 그러므로 "test5 end"와 "main end" 는 출력되지 않음!!


💡자동 리소스 닫기

try-with-resources
예외 발생 여부와는 상관 없다. 사용했던 리소스 객체의 close() 메소드를 호출해 리소스를 닫는다. 리소스 객체는 java.lang.AutoCloseable 인터페이스를 구현하고 있어야 한다.

💡예외 떠 넘기기

throws는 메소드 끝에 작성한다. 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠 넘기는 역할이다.

형태

리턴타입 메소드명(매개변수,..) throws 예외클래스1, 예외클래스2, ... {

}

발생할 수 있는 예외를 throws 뒤로 나열하는 것이 일반적이지만 Exception(상위 예외 클래스)으로 모든 예외를 간단히 떠넘길 수 있다.

💡사용자 정의 예외

class NoPowerException extends Exception{ //Exception을 상속 받아주어야 한다.
	public NoPowerException(String msg) {
		super(msg);
		//Exception(메시지) super(메시지) -> detailMessage = 메시지
	}
}

💡예외 발생시키기

의도하여 코드에서 예외를 발생시킬 수 있다.

throw new Exception();
throw new Exception(message);

public void method() throws Exception{
	throw new NoPowerException("힘이없다");
}

예외를 발생시킬 때 생성자 매개값으로 사용한 메시지를 리턴하려면 getMessage() 메소드를 사용할 수 있다.

} catch(Exception e) {
	String message = e.getMessage();
}

-> message라는 변수에는 "힘이없다"라는 문자열이 담긴다.


(교재 : 이것이 자바다 저자:신용권)

profile
Have a good day ⌯’▾’⌯

0개의 댓글