신세게 - Java 공부

4주차 배운점 느낀점- 예외처리, 예외, try, catch, finally, throws, throw, 사용자정의예외

휘로그 2024. 10. 3. 23:22
728x90
반응형

4주차 마지막날

 

강사님이 발표에대해 말씀주시며 하루를 시작했다. 말할때 똑부러지게할 것 !!
이친구 팔로우업하면 따라올것이라는 기대치를 줄 것!!
나에 대한 희망을 줄 것
구직할때 회사마다 . 기준이 있고 전략이있다 . 함부로 뽑지않는다. 그러니
남들지원한다고 우루루 하지마라. 가고싶은회사 , 직무에관해 봐라 , 어떤기술이 필요한지 명확하게 나온다.
전략적으로!!

 

배운점

 

예외와 에러
예외: 잘못된 사용 또는 코딩으로 인한 오류
에러와 달리 예외 처리를 통해 계속 실행 상태를 유지할 수 있음
일반 예외(Exception): 컴파일러가 예외 처리 코드 여부를 검사하는 예외, 체크 이셉션
실행 예외(Runtime Exception): 컴파일러가 예외 처리 코드 여부를 검사하지 않는 예외, 언체크 이셉션

 

Throwable 예외처리하는 최상위 클래스: 슈퍼 클래스
모든 예외, 에러의 부모

 

 

 

 


Error: 하드웨어적인 문제, 실행적인부분 외에 문제
예외처리하면 완전 종료
불안정한 종료: 그안에 코드들 실행할 기회도 얻지 못함. 이유도모르고 당함
예외는 왜해야된다? 프로그램이 정상적으로 종료되어서 어떠한 문제점인지 테스팅해서 결과를 볼 수 있게끔함
문제발생하더라도 다음 프로그램을 돌릴 수 있다

exception 클래스 하위클래스 들

 

 

예외 처리


예외 발생 시 프로그램의 갑작스러운 종료를 막고 정상 실행을 유지할 수 있게 처리하는 코드
예외 처리 코드는 try-catch-finally 블록으로 구성
trycatch-finally 블록은 생성자 내부와 메소드 내부에서 작성 원칙으로 함

 

여러개의 필터를 걸러내는 것, 마지막에는 원하는 결과 처리

 

 

자바는 개발자가.. 표준라이브러리제공하는것이 가장큰 장점이라고생각합니다.
체크예외: 컴파일 하기 전에 반드시 throws 든 try-catch 든 예외처리를 해줘야 실행이 가능한 예외이다.
언체크드예외: RuntimeException 하위 예외들은 언체크 예외이므로, 필요하면 throws나 try-catch로 잡아준다.
처리해줘도 안해줘도 프로그램은 돌아가지만 불안정하다.
선택적 예외처리다. 개발자의 성실도에 따라서 차이가 많이 날 수 있다.

 

예외출력 방식 3가지
null이 들어 오면 안되니까 NullPointerException 사용
변수는 e아니어도됨


(print)e.getMessage() , (print)e.toString(), e.printStackTrace();

private static void printLength(String s) {
    try {
      int result = s.length();
      System.out.println("문자 수: "+result);
    }catch (NullPointerException e){
      System.out.println(e.getMessage()); 
      // 에러 출력방식 1 : 에러의 원인을 간단하게 출력
      System.out.println("입력데이터가 잘 못되었습니다. 다시 입력하세요"); 
      // 에러 출력방식 1 : 사용자 편하게
      System.out.println(e.toString()); 
      //예외 출력방식 2 : exception의 내용과 원인 출력
      e.printStackTrace(); 
      //예외 출력방식 3 : 에러의 발생 근원지를 찾아 단계별로 에러를 출력
      // 개발자입장에서 이게 유리
    }

  }

 

결과

 

 

배열 범위 넘었을 때: ArrayIndexOutOfBoundsException

 

    for (int i = 0; i < 6; i++) {
      try {
        array[i] = sc.nextInt();
      } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println(e.getMessage());
        System.out.println(e.toString());
        e.printStackTrace();
      }
    }

 

예외 처리는 프로그램이 비정상 종료되는 것을 방지하는 중요한 역할을 한다.
예외가 발생해도 종료 되지 않도록 try-catch로 예외처리
예외처리는 필수적이다!!!

 

try-catch
파일 없을 때: FileNotFoundException
인풋아웃풋 문제: IOException
사용한 리소스를 다룰때 반드시 반환 시켜주어야한다.
fis를 닫아주어야함
finally 반드시 수행해어야하는 블록

public static void FileInput() {
    FileInputStream fis = null;
    try {
      fis = new FileInputStream("src/oop/exception/data.txt");
      System.out.println("파일 읽기 완료");

    } catch (FileNotFoundException e) {
      System.out.println("해당 파일이 존재하지 않습니다.");
      e.printStackTrace();
      System.out.println(e.getMessage());
      System.out.println(e);
      return;
    } finally {//닫혀있을 때
      try {
        if (fis != null) {
          fis.close(); // 닫을때 문제가 생기면
        }
      }catch (IOException io1){ // 인풋아웃풋의 모든 예외처리
        io1.printStackTrace();
      }
    }
    System.out.println("finall문은 항상 수행됨");
  }

 

모든 예외 떠넘기기
나열할 예외 클래스가 많으면 throws Exception 또는 throws Throwable
throwable 최상위 클래스에게 던져버리면 한번에 처리할 수 있다.
throws Exception, throws Throwable

 

Surround try/multi-chatch
같은 레벨끼리 or 로 같이 처리할 수 있다. 선택하여 생성 한다.

 catch (FileNotFoundException | ClassNotFoundException cf){
      cf.getMessage();
    }

throws
메소드 내부에서 예외 발생 시 throws 키워드 이용해 메소드를 호출한 곳으로 예외 떠넘기기
throws는 메소드 선언부 끝에 작성. 떠넘길 예외 클래스를 쉼표로 구분해서 나열
나열할 예외 클래스가 많으면 throws Exception 또는 throws Throwable 만으로 모든 예외 떠넘기기
예외 처리 미루기: 니가 호출한건 니가 처리해 니가싼똥 니가처리해
나를 호출한 그 위치로 다시 던져주기
->메소드에서 throws 하고 main에서 try-catch를 써준다.
FileNotFoundException: 파일 없을때

 public static void main(String[] args) {
    ThrowsException test = new ThrowsException();
    try{
      test.loadClass("src/oop/exception/data.txt","java.lang.String");
    }catch (FileNotFoundException f ){ //이순서로 처리하는게 맞아
      f.printStackTrace();
      // 문제가 생긴 내용을 파일엔 저장할 것을 log 라고한다.
      // 내 작업리스트를 저장해 놓고 있음.
    }catch (ClassNotFoundException cf){
      cf.printStackTrace();
    }catch (Exception e){
      e.printStackTrace();
    }
  }

  private Class loadClass(String fileName, String className) throws FileNotFoundException,ClassNotFoundException {
    // exception발생하면 메인으로 던진다. !
    // throws를 이용해서 예외처리를 미룬 것
    // 나를 호출한 니가 처리하고 정상적으로 처리해
    FileInputStream fis = new FileInputStream(fileName);
    Class c = Class.forName(className);
    return c;

  }

 

상위클래스라 먼저 처리할 수 없다.
처리해야 할 예외 클래스들이 상속 관계에 있을 때는 하위 클래스 catch 블록을 먼저 작성하고 상위 클래스 catch 블록을 나중에 작성해야 함

 

 

리소스
데이터를 제공하는 객체
리소스는 사용하기 위해 열어야(open) 하며, 사용이 끝난 다음에는 닫아야(close) 함
리소스를 사용하다가 예외가 발생될 경우에도 안전하게 닫는 것이 중요
try-with-resources 블록을 사용하면 예외 발생 여부와 상관없이 리소스를 자동으로 닫아줌
예외발생으로 정상적으로 종료되어도 반드시 close 해야한다 중요!!
리소스를 처리하는 방식

 

 

ArithmeticException: 나누기 0 예외

 

finally
무조건수행 보장
catch에 어떤 return이 있건 finally에 return 하면 무조건적으로 finally꺼가 리턴됨
finally 없으면 정상적이면 try에있는게 return, catch에 걸리는게 return

 

finally 무조건 실행이니까 1이 다 리턴됨, finally 없고 try에서 끝나면 0 리턴, 그 뒤catch에서 걸리면 2 또는 3 리턴

 

 try {
      double result = num1 / num2;
      String data = String.format("%.2f", result);
      System.out.println(data);
      return 0;
    } catch (ArithmeticException ar) {
      ar.getMessage();
      System.out.println("ArithmeticException catch구문 출력");
      return 2;
    } catch (Exception e) {
      e.getMessage();
      System.out.println("catch 구문 출력");
      return 3;
    } finally {
      System.out.println("finally 구문 출력");
      return 1;
    }

 

throws 예외를 미룰때
throw 사용자 정의 예외를 그 코드에 직접해줄 수 있게 하는것

 

사용자 정의 예외
표준 라이브러리에는 없어 직접 정의하는 예외클래스
일반 예외는 Exception의 자식 클래스로 선언. 실행 예외는 RuntimeException의 자식 클래스로 선언
사용자가 새로운 예외 클래스를 만들어서 이용할 수 있는 방법
java.lang 패키지의 Exception 예외 클래스를 상속받아 작성
사용자 정의 예외 클래스에 대한 생성자를 정의하고(필수는 아님)
toString() 메서드를 재정의하여 catch 블록에서 사용자 정의 메시지를 표시할 수 있음
사용자 정의 예외 클래스를 만들고 throw 키워드로 예외를 발생시켜 호출함

 

예외 발생시키기
throw 키워드와 함께 예외 객체를 제공해 사용자 정의 예외를 직접 코드에서 발생시킬 수 있음
예외의 원인에 해당하는 메시지를 제공하려면 생성자 매개값으로 전달

 

예시:
PasswordCheckException class
Exception 을 상속받은 클래스
예외 상황 메세지를 생성자에서 받는다.
Exception 클래스에서 메시지 생성자, 멤버 변수, 메소드를 제공받는다.
예외 메세지를 설정함
getMessage()를 통하여 메세지 내용을 확인할 수 있다.

public class PasswordCheckException extends Exception{
  public PasswordCheckException(String message){
    super(message);
  }
}

 

main이 있는 클래스에 setPW로 비밀번호를 받고 예외처리해주는 메소드를 따로 만들었다.
setPW 메소드는 throws로 PasswordCheckException 에 던진다.
PasswordMain pw 객체를 만들고 pw.setPW로 받은 비밀번호를 보낸다.
setPW에서는 if로 예외처리할 내용을 걸어주고 throw new 로 메시지를담아PasswordCheckException객체를 생성한다.

 

public class PasswordMain {

  private String pw; //필드멤버

  public String getPW() { //getter
    return pw;
  }

public void setPW(String pw) throws PasswordCheckException {
    //PasswordCheckException이 처리해!!
    if (pw == null) { // null일때
      throw new PasswordCheckException("패스워드는 null 일 수 없습니다.");
    } else if (pw.length() < 6) { //길이 5이하일때
      throw new PasswordCheckException("5이하는 안됩니다.");
    } else if(!pw.matches("^[a-zA-Z0-9]*$")){ // 숫자 영문자가 아닐때
      throw new PasswordCheckException("영문자,숫자만 됩니다.");
    }
    this.pw = pw; // 위에 과정이 끝나면 초기화
  }

  public static void main(String[] args) {

    PasswordMain pw = new PasswordMain(); // 메인클래스 객체
    String pass = null;
    try {
      pass = sc.next(); //입력
      pw.setPW(pass);   // 검사메소드로 보냄
      System.out.println(pw.getPW()+"회원가입 완료");
    }catch (PasswordCheckException p){  // 검사보냄
      System.out.println(p.getMessage());
    }catch (Exception e){
      System.out.println("예외 발생 다시시작");
    }
    

  }
}

 

 

회고

 

올 해의 마지막 수업날이다. 내일 쉬어서 너무 좋다.
한 달이 지났는데 내가 알던 자바라고 생각했지만 내가 알고 있던 자바는 대강 알던지식이구나 싶다.
한 달 하면서 느낀건, 진도를 차근차근 나가고 한가지 주제에 대해 다양하게 예제를 실습할 수있어서 좋다. 내가 모르는, 새로운 부분을 구석구석 채워나가는 느낌이다. 약 1/6 이 지났다.
지금보다 더 부지런히 공부해야겠다.

반응형