2021. 04. 19(월) TIL

Dylan·2021년 4월 19일
0

Java

복습

  • Collection<E>
    • List<E> : 순서대로 저장하고, 순서대로 조회가능
      • ArrayList<E>
    • Set<E> : 중복없이 저장가능
      • HastSet<E>
      • TreeSet<E> : 오름차순 정렬
  • Map<K, V>
    • 저장할 데이터가 가변성이 높은 데이터
    • 저장할 데이터가 key, value의 쌍으로 연결된 데이터
    • 저장된 데이터를 빠르게 검색
    • HashMap<K, V>

예외처리

  • 예외처리란 프로그램 실행 시 발생할 수 있는 에 대비하는 것으로 프로그램 비정상종료를 막고 실행 상태를 유지하는 것입니다.

오류의 종류

에러(Error)

  • 시스템, 운영체제, JVM의 잘못으로 발생되는 것
  • 개발자가 해결할 수 있는 문제가 아님
  • 예외처리의 대상이 아님

예외(Exception)

  • 예외는 개발자의 코딩실수나 사용자의 잘못된 프로그램 사용으로 발생하는 오류다.
  • 예외는 예외처리를 통해서 비정상적인 종류를 예방할 수 있다.
  • 예외는 UncheckedException과 CheckedException으로 구분한다.

UnCheckedException

  • RuntimeException 클래스와 그 자식 클래스들이다.
  • 주로 개발자의 코딩 실수로 발생되는 오류들이다.
  • 컴파일러가 예외처리 여부를 체크하지 않는다.
  • 주요 예외 클래스
    • RunTimeException
      • 모든 UnChecked Exception의 부모 클래스다.
    • NullPointerException
      • 참조변수의 값이 null인 상태에서 필드나 메소드를 사용할 때 발생하는 예외 클래스다.
    • ClassCastException
      • 클래스 형변환이 가능하지 않을 때 발생하는 예외 클래스다.
    • ArithmeticException
      • 나눗셈에서 어떤 값을 0으로 나눌 때 발생하는 예외 클래스다.
    • IndexOutOfBoundsException
      • 배열, 리스트, 문자열에서 인덱스 범위를 벗어난 위치를 조회했을 때 발생하는 예외 클래스다.
    • NumberFormatException
      • 숫자가 아닌 문자를 포함하고 있는 문자열을 정수나 실수로 변환할 때 발생하는 예외 클래스다.
      • Integer.parseInt(s), Double.parseDouble(s) 등을 실행할 때 발생한다.
package day1;

public class ExceptionApp1 {

	public static void main(String[] args) {
		// 개발자의 코딩 실수로 발생하는 예외들
		// - RuntimeException 클래스 및 그 하위예외클래스들은 개발자의 코딩 실수가
		//   그 원인이 되는 예외다.
		// - 해당 예외가 발생하는 수행문 혹은 메소드에 대해서는 예외처리 여부를 
		//   체크하지 않는다.
		// - 개발자는 해당 예외가 발생되지 않도록 코딩실수를 최대한 줄여야 한다.
		// - 개발자는 필요에 따라서 try ~ catch 구문으로 예외상황 발생시 실행할 수행문을
		//   작성할 수 있다.
		
		// NullPointerException
		// 참조변수가 null값을 가지고 있다. 즉 그 참조변수는 객체를 참조하고 있지 않는 상태다.
		// 그 참조변수로 해당 클래스에서 제공하는 속성이나 기능을 사용하려는 경우 발생하는 예외다.
//		String text = null;
//		System.out.println(text.length());
		
		// IndexOutOfBoundsException
		// 		ArrayIndexOutOfBoundsException
		//		배열의 인덱스범위를 벗어난 인덱스를 사용했을 때 발생하는 예외다.
		//		StringIndexOutOfBoundsException
		//		문자열의 길이를 초과한 인덱스를 사용했을 떄 발생하는 예외다.
//		String[] names = {"김유신", "강감찬", "이순신"};
//		System.out.println(names[1]);
//		System.out.println(names[2]);
//		System.out.println(names[3]);
		
//		String text = "안녕하세요";
//		String subText = text.substring(0, 10);
//		System.out.println("부분문자열 : " + subText);
		
		// ArithmeticException
		// 숫자를 0으로 나눌 때 발생하는 예외다.
//		System.out.println(10/0);
		
		// ClassCastException
		// 클래스 형변환이 잘못되었을 때 발생하는 예외다.
//		Phone p = new SmartPhone();
//		SmartPhone p1 = (SmartPhone) p;
//		FeaturePhone p2 = (FeaturePhone) p;
	}
	
	static class Phone {}
	static class FeaturePhone extends Phone {}
	static class SmartPhone extends Phone {}
}

CheckedException

  • Exception 클래스와 Exception 클래스의 하위 클래스중에서 RuntimeException 클래스의 하위 클래스가 아닌 예외클래스다.
  • 사용자의 잘못된 사용으로 인해 발생하는 오류들이다.
  • 컴파일러가 예외처리 구현 여부를 반드시 체크한다.
    • 예외처리 관련 코드가 구현되어 있지 않으면 컴파일 오류가 발생한다.
    • 최신의 라이브러리나 프레임워크에서는 CheckedException의 사용비중이 점점 줄어들고 있다.
  • 주요 클래스
    • Exception
      • 모든 Checked Exception의 부모 클래스다.
    • ClassNotFoundException
      • 클래스파일을 찾을 수 없을 때 발생하는 예외클래스다.
    • IOException
      • 읽기/쓰기 하는 도중 오류가 발생했을 때 발생하는 예외클래스다.
      • 네트워크를 통해서 다른 컴퓨터와 데이터 교환중 오류가 발생했을 때 발생하는 예외클래스다.
    • FileNotFoundException
      • 파일을 찾을 수 없을 때 발생하는 예외 클래스다.
    • SQLException
      • 데이터베이스 엑세스 작업 중 오류가 발생했을 때 발생하는 예외클래스다.

예외처리하기

  • try ~ catch 구문을 사용해서 직접 에외를 처리할 수 있다.
  • throws를 사용해서 예외처리를 위임할 수 있다.

try ~ catch 구문으로 예외처리하기

  • 예외처리는 try ~ catch 구문을 사용한다.

  • try ~ catch 구문 작성법

      try {
        예외발생이 예상되는 수행문;
        예외발생이 예상되는 수행문;
        수행문;
      } catch(예외클래스타입 변수명) {
    
      } catch(예외클래스타입 변수명) {
    
      } catch(Exception 변수명) {
    
      }
  • try 블록에서는 예외발생이 예상되는 수행문을 적는다.

  • catch 블록은 try 블록에서 예외가 발생했을 때 해당 예외를 잡는다.

  • catch 블록에서 예외를 잡지않으면 프로그램이 비정상적으로 종료된다.

  • try 블록에서 여러 종류의 예외발생이 예상되는 수행문을 적었을 경우에는 그 예외의 종류만큼 catch 블록을 추가한다.

  • catch 블록에서는 발생한 예외를 잡고, 그 예외발생시 실행할 수행문을 적는다.

  • catch 블록에서는 작업내용

    • 발생한 예외정보를 로그로 기록하기
    • 사용자에게 에외발생원인 안내하기
    • 개발자에게 오류 수정을 위한 디버깅메세지 출력하기
    • 발생한 예외를 다른 예외로 바꾸기
  • catch 블록을 작성할 때는 부모예외클래스를 잡는 catch블록을 아래쪽에 적는다.

  • 맨 마지막 catch 블록에는 Exception 클래스를 지정해서 예상하지 못한 예외도 잡을 수 있도록 한다.

  • try ~ catch 구문으로 에외처리시 수행문 실행

      try {
        예외발생이 예상되는 수행문1;
        수행문2;
        수행문3;
      } catch (발생이예상되는예외클래스명 변수명) {
        예외 발생시 실행될 수행문4;
        예외 발생시 실행될 수행문5;
      }
      수행문6;
    • 수행문1에서 예외발생하지 않는 경우 실행되는 수행문
      1. 예외발생이 예상되는 수행문1
      2. 수행문2
      3. 수행문3
      4. 수행문6
    • 수행문1에서 예외가 발생하는 경우 실행되는 수행문
      1. 예외발생이 예상되는 수행문1
      2. 예외 발생시 실행될 수행문4
      3. 예외 발생시 실행될 수행문5
      4. 수행문6

throws로 예외처리 위임하기

  • 메소드에서 발생하는 예외를 직접 처리하지 않고, 그 메소드를 호출하는 측에서 예외처리를 위임하는 것이다.
  • throws 키워드를 사용해서 예외처리를 위임할 수 있다.
  • 예외를 위임하기
      public void method() throws 예외클래스명, 예외클래스명, ... {
        예외발생이 예상되는 수행문;
        예외발생이 예상되는 수행문;
      }
  • 해당 메소드에서 예외처리와 관련한 코드의 작성을 할 필요가 없다.
  • 예외처리를 각각의 메소드에서 직접 개별적으로 처리하지 않고, 한 군데에서 일괄처리하게 만들 수 있다.

예외클래스의 주요 API

  • Throwable
    • Error, Exception의 부모 클래스
    • 오류와 관련된 모든 메소드들이 구현되어 있다.
    • 모든 Error, Exception 클래스는 Throwable에 구현된 메소드를 상속받고, 사용할 수 있다.
    • 특별한 경우가 아니면 사용자정의 예외클래스를 정의할 때 생성자만 정의해도 된다.
    • 주요 생성자
      • public Throwable() { ... }
        • 기본생성자
      • public Throwable(String message) { ... }
        • 오류와 관련된 메세지를 전달받는 생성자
      • public Throwable(String message, Throwable cause) { ... }
        • 오류와 관련된 메세지 및 오류의 원인이 되었던 이전 예외객체를 전달받는 생성자
      • public Throwable(Throwable cause) { ... }
        • 오류의 원인이 되었던 이전 예외객체를 전달받는 생성자
    • 주요 메소드
      • Throwable getCouse()
        • 오류발생의 원인이 되었던 오류를 반환한다.
      • String getMessage()
      • 오류와 관련된 상세한 메세지를 반환한다.
      • void printStackTrace()
      • 오류 발생과 관련되어서 실행되었던 코드를 화면에 출력한다.
      • 오류검출을 위한 디버깅 작업에서 참조한다.
      • void printStackTrace(PrintStream s)
        • 오류 발생과 관련되어서 실행되었던 코드를 화면이 아닌 다른 곳에 출력하게 할 수 있다.
      • void printStackTrace(PrintWriter s)
        • 오류 발생과 관련되어서 실행되었던 코드를 화면이 아닌 다른 곳에 출력하게 할 수 있다.

출처 : https://github.com/eungsu/documents/edit/master/01-java/10-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC.md

0개의 댓글