Day 38

dokiru·2023년 3월 23일
0

학원

목록 보기
30/51

코드 피드백

  • 객체 단위로 비교하면 같은 주소가 나올수 있지만, 같은 범위가 아니면 같은 주소를 참조한다고 보장할 수 없음 => 고로 문자열 비교는 equals를 사용하자!!
  • 자주 반복되는건 메소드로 빼서 재사용하자..

예외 처리

  • 오류의 종류
  1. 에러(Error) : 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생

  2. 예외(Exception) : 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류

공통점차이점
발생하면 프로그램 즉시 종료예외는 예외 처리를 통해 프로그램을 종료하기 않고 정상 실행 상태가 유지되도록 할 수 있음
  • 예외의 종류
  1. 일반 예외 : 자바 소스를 컴파일하는 과정에서 예외 처리 코드가 필요한지 검사, 없다면 컴파일 오류 발생 (ex. ClassNotFoundException, interruptedException...)
  2. 실행 예외 : 컴파일 과정에서 예외 처리 코드를 검사하지 않는 예외, 개발자의 경험을 바탕으로 처리해야함 (ex. NullPointerException, ClassCastException, NumberFormatException)

실행 예외

: 자바 컴파일러가 체크를 하지 않기 때문에 오로지 개발자의 경험에 의해서 예외 처리 코드를 삽입해야함 (넣지 않을 경우 종료됨)

  1. NullPointerException : 객체 참조가 없는 상태, null값을 갖는 참조 변수를 도트 연산자로 접근하려고 할 때 발생

  2. ArrayIndexOutOfBoundsException
    : 배열에서 인덱스 범위를 초과하여 사용할 경우 발생

  3. NumberFormatException
    : 숫자로 변환될 수 없는 문자를 숫자로 변환하려고 시도할 때 발생 (ex. "a100")

  4. ClassCastException
    : 상위-하위클래스, 구현클래스-인터페이스 간의 타입 변환이 아닌 클래스를 강제로 타입 변환하려고 시도할 때 발생

Sample s2 = null;
// System.out.println(s2.toString()); NullPointerException
		
int arr[] = { 1, 2, 3 };
System.out.println(arr[1]);
// System.out.println(arr[3]); ArrayIndexOutOfBoundsException
		
String str1 = "5";
String str2 = "5A";

int num1 = Integer.parseInt(str1);
// int num2 = Integer.parseInt(str2); NumberFormatException
		
Parent p1 = new Parent();
Child c1 = new Child();
		
Parent p2 = new Child(); // 부모 타입 변수에 자식 객체
Child c2 = (Child)p2; // 강제형변환
// Child c3 = (Child)p1; ClassCastException

예외 처리 코드

: 예외 발생시 프로그램 종료를 막고 정상 실행 유지할 수 있도록 처리하는 것

  • try-catch-finally 이용
Sample s2 = null;
try {
	s2.toString();
} catch(Exception e) {
	// try문에서 오류 발생하면 이곳으로
    System.out.println(e.getMessage());
	System.out.println("예외 발생!!!!!!!1111"); 
	e.printStackTrace();
} finally {
	// 1. try문에서 오류 발생 안한 경우
    // 2. try문에서 오류 발생해서, catch문 수행한 이후
    // => finally문은 항상 실행!
    System.out.println("항상 실행!");
}
  • e.getMessage() : Cannot invoke "Object.toString()" because "s2" is null => 예외 메시지 간략하게
  • e.printStackTrace() : java.lang.NullPointerException: Cannot invoke "Object.toString()" because "s2" is null at chapter10.Try001.main(Try001.java:13) => 좀 더 구체적으로 어떤 파일의 어떤 부분에서 오류가 발생했는지

다중 catch

: catch 블록이 여러 개여도 하나의 catch문만 실행 (try문에서 하나의 예외가 발생하면 즉시 실행을 멈추고 catch문으로 가기 때문에)
: 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 함
: 하위도 결국 상위를 상속한 것이기 때문에 하위가 상위보다 위에 위치하면 하위 예외 클래스의 catch문은 실행되지 않음

	try {
			System.out.println(s2.toString()); 
	} catch(NullPointerException e) { // 더 작은 catch가 앞쪽으로 와야함
			System.out.println("구체적이고 작은 예외 발생!!!!!!!");
	} catch(Exception e) {
			System.out.println("좀 더 상위의 예외 발생!!!!!!!1111"); 
	}  finally {			
			System.out.println("결국에 항상 실행되는 finally!!!!");
	}
		

멀티 catch

: 괄호안에 or연산자(|)를 통해 한 블록에서 여러개의 예외를 처리할 수 있게 함

try-with-resources

: 예외 발생 여부와 상관없이 사용했던 리소스 객체의 close메소드를 호출해서 안전하게 리소스를 닫아주는 역할
: 조건 : 리소스 객체가 java.lang.AutoCloseable 인터페이스를 구현하고 있어야함

ex.

try(FileInputStream fis = new FileInputStream('file.txt')) {
	...
} catch(IOException e) {
	...
}

=> try 블록이 정상적으로 실행을 완료했거나 도중에 예외가 발생하게 되면 자동으로 FileInputStream의 close 메소드가 호출
=> try 블록에서 예외가 발생하면 우선 close로 리소스를 닫고 catch 블록 실행

profile
안녕하세요!

0개의 댓글