JAVA_43_오류, 예외

charl hi·2021년 9월 2일
0

JAVA

목록 보기
43/53

프로그램 오류

  1. 컴파일 에러 : 컴파일할 때 발생하는 에러

  2. 런타임 에러 : 실행할 때 발생하는 에러

  3. 논리적 에러 : 작성 의도와 다르게 동작

런타임 에러

  1. 에러 error
    : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류

  2. 예외 exception
    : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류



예외처리

  • 예외 발생에 대비한 코드를 작성하는 것
  • 목적 : 프로그램의 비정상 오류를 막고, 정상적인 실행상태를 유지하는 것

예외 클래스

  • Object - Throwable(모든 예외클래스의 조상) - Error / Exception

Exception 클래스들

  • Exception클래스와 그 자손들

  • Exception - IOException(입출력예외)/ ClassNotFoundException(클래스못찾음)/.../RuntimeException

  • 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외

  • checked : ✨예외처리가 필수! 컴파일 에러


RuntimeException 클래스들

  • RuntimeException클래스와 그 자손들

  • RuntimeException - ArithmeticException(산술계산)/ ClassCastException(형변환)/ NullPointerException(널포인터)/... IndexOutOfBoundsException(범위벗어남?)

  • 프로그래머의 실수로 발생하는 예외

  • unchecked : 예외처리가 선택! 컴파일 OK, ✨but 비정상종료



try-catch

try {
	//예외가 발생할 가능성이 있는 문장들
} catch (Exception1 e1) {
	//Exception1이 발생했을 경우, 이를 처리하기 위한 문장
} catch (Exception2 e2) {
	//Exception2이 발생했을 경우, 이를 처리하기 위한 문장
} catch (ExceptionN 참조변수) {
	//Exception1이 발생했을 경우, 이를 처리하기 위한 문장
} 
  • 대괄호 생략 불가

  • 예외 발생
    -> catch{}을 찾아 내려감
    -> 그래서 예외가 발생하면 예외 다음 문장은 실행되지 않는다!

  • 일치하는 catch{}이 없으면 예외 처리 안됨!

  • (Exception e)이 선언된 catch블럭

    • 모든 예외 처리
    • 마지막에 catch(Exception e){...}로 하기!!

public class Ex8_02 {

	public static void main(String[] args) {
		System.out.println(1);
		try {
			System.out.println(3/0);
			System.out.println(2);	//예외발생하면 다음문장 넘어감
		} catch (ArithmeticException ae) {
			System.out.println(4);
		}
		System.out.println(5);

	}

}

1
4
5


예외 흐름

  1. 예외 발생

  2. 해당 예외 객체 생성(예: ArithmeticException 객체 생성)

  3. 그 객체 안에는 예외 정보(메소드 등)가 들어있다.

    1) printStackTrace()

    2) getMessage()

    ...

  4. catch (예외타입 참조변수) 에서 참조변수ae가 그 객체(ArithmeticException)를 가리킴

  1. 참조변수의 타입(예외타입)이 그 객체(ArithmeticException)랑 일치하면 해당 catch{} 실행

  2. 우리는 참조변수와 3번의 메소드들을 사용해 객체에 담긴 예외정보를 다룰 수 있다.

    1) ae.printStackTrace();
    2) ae.getMessage();


예외 메소드

printStackTrace()

  • 예외발생 당시의 호출스택(Call Stack)에 있었던 메소드의 정보와 예외 메세지를 화면에 출력한다.

getMessage()

  • 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있다.

  • 타입 : String


public class Ex8_04 {

	public static void main(String[] args) {
		System.out.println(1);
		System.out.println(2);
		try {
			System.out.println(3);
			System.out.println(3/0);	//AE
			System.out.println(4);		//실행 안함
			
		} catch (ArithmeticException ae) {
			if(ae instanceof ArithmeticException) {	//*****
				System.out.println("true");
			}
			System.out.println("ArithmeticException");
			ae.printStackTrace();
			System.out.println(ae.getMessage());
		} catch (Exception e) {	//AE 제외하고 모든 예외, 제일 마지막
			System.out.println("Exception");
		}
		System.out.println(6);

	}

}

  • java.lang.ArithmeticException : 오류 종류(클래스)
  • / by zero : 0을 나눠서 오류
  • at Ex8_04.main(Ex8_04.java~:9) : 해당 소스파일의 main함수의 (맨위에서) 9번째 줄에서 오류



public class Ex8_05 {

	public static void main(String[] args) {
		System.out.println(1);
		System.out.println(2);
		try {
			System.out.println(3);
			System.out.println(3/0);
			System.out.println(4);
			
		} catch (ArithmeticException ae) {
			ae.printStackTrace();
			System.out.println("예외메세지 : "+ae.getMessage());
		} catch (Exception e) {
			// TODO: handle exception
		}
		System.out.println(6);

	}

}



멀티 catch블럭

  • 내용이 같은 catch블럭들을 하나로 합친 것(중복제거)

  • 부모-자식 관계의 블럭은 X

  • 두 블럭의 공통멤버만 사용 가능




Ref

0개의 댓글

관련 채용 정보