[JAVA] 예외 처리

입력하다

예외 처리에 대해 깊이 생각해 본 적이 없는 것 같습니다. 간단히 ‘문제가 있으면 예외를 던져라.’ 평생 생각해왔던 것 같아요. 그런데 유테코에서 예외 처리에 대한 이야기를 듣고 생각을 정리해야 할 것 같아서 정리해 보았습니다.


예외 및 오류

예외를 살펴보기 전에 오류와 예외를 구분해야 합니다.

실수코드로 수정할 수 없는 오류를 나타냅니다. 개발자의 예측으로는 막을 수 없습니다.

OutOfMemoryError, StackOverflowError 등이 발생합니다.

예외개발자가 직접 예측하고 방지할 수 있는 오류를 나타냅니다. 개발자의 코드, 논리 및 사용자에 의해 발생할 수 있고 방지할 수 있습니다.

다음 그림은 오류와 예외 사이의 상속 관계를 보여줍니다.


예외 상속 구조


예외 및 오류 던질 수 있는계승하다

던질 수 있는 개체에는 예외 및 오류에 대한 메시지와 관련 예외 및 오류에 대한 정보가 포함됩니다. 우리가 자주 사용하는 getMessage(), printStackTrace() 메서드로 구현 이것은 상속된 오류 및 예외에서 사용하는 것입니다.


프로그램 예외

컴파일 오류

컴파일 오류컴파일 중에 오류가 발생하면 컴파일러에서 오류 메시지를 표시한다는 의미입니다. 개발자가 코드를 작성하는 동안 실수를 하면 컴파일 오류가 발생합니다.

확인된 예외 또한 이것은 먼저 문제를 확인하고 실행 여부를 결정하기 때문입니다.

예: 미사일은 북한에만 보낼 수 있는데 개발자가 일본에 보낸다면? → 개발자가 의도하지 않은 프로그래밍을 방지하기 위함입니다.

체크 예외는 따로 처리가 필요하다고 생각합니다. 개발자는 좋은 코드를 작성하기만 하면 된다고 생각합니다. 반면에 코드의 양이 늘어나면 다른 개발자를 제한하여 해결할 수 있을 것 같은데 잘 모르겠습니다.

런타임 에러

프로그램 실행 중 오류가 발생하여 잘못된 결과나 예상치 못한 문제로 인해 프로그램이 비정상적으로 종료되는 것을 의미합니다.

확인되지 않은 예외 문제를 확인하지 않고 실행하기 때문에 이라고도 합니다.

우리가 항상 이야기하는 것은 컴파일 오류, 런타임 오류입니다. 그래서 “컴파일 오류가 위의 오류라면 코드가 복구할 수 없나요?” 나는 그것에 대해 생각했다. 그러나 Java는 오류를 오류와 예외로 나누고 컴파일 오류와 런타임 오류는 예외로 나눕니다.


확인된 예외와 확인되지 않은 예외는 언제 사용해야 합니까?

예외가 있는 호출 방법은 무엇입니까? 의미 있는 일가능한 경우 Checked Exception을 사용하는 것이 좋습니다. 예외 처리에 대한 책임을 안정적으로 전달할 수 있기 때문입니다.

호출 메서드가 예외를 포착하는 경우 예외 또는 문제를 해결할 수 없는 경우 확인되지 않은 예외를 사용하십시오. 개발자나 사용자가 오류를 처리할 수 있습니다.

명확하지 않은 경우 확인되지 않은 예외를 사용하십시오.

Checked Exception을 사용하면 throws를 사용하여 호출된 메서드에서 호출된 메서드로 예외가 발생했다고 말할 수 있습니다. 지속적으로 발생하는 예외는 가독성을 떨어뜨리고 예외가 발생한 위치를 알 수 없게 만듭니다. 이 경우 Throw로 처리되는 예외는 Unchecked Exception을 통해 처리할 수 있습니다. 그래서 가공면~에 달려있다


예외 처리

트라이 캐치

다음 코드와 같은 방식으로 try-catch-finally 키워드를 사용하여 예외를 처리할 수 있습니다.

try : 이 블록에서 예외를 throw할 수 있는 코드

catch : 예외 발생 시 처리할 동작

try {
      return new Names(inputView.readPlayerNames());
  } catch (Exception e) {
      System.out.println(e.getMessage());
      return setNames();
  }

던진다

예외를 던지고 있습니다. 예외는 여기에서 처리되지 않으며 오류 처리에 대한 책임은 메서드를 호출한 메서드로 전달됩니다.

public static void divide(int a,int b) throws ArithmeticException {
    if(b==0) throw new ArithmeticException("0으로 나눌수 없다.");
    System.out.println(a/b);
}

예외에 대해 알아야 할 사항

  • 메서드에서 쉼표(,)로 인해 여러 예외가 발생할 수 있습니다.
  • 예외가 여러 개인 경우 throws 예외로 처리할 수 있습니다.
  • try-catch 문에서 여러 개의 예외 catch 문을 사용하여 처리할 수 있습니다.
  • 예외를 처리하고 예외를 다시 던질 수 있습니다.
  • StackTrace를 사용하면 발생 경로를 추적하여 예외의 원인을 찾을 수 있습니다.

예외 처리 사용

복원하다

예외를 발생시킨 문제를 정상 상태로 되돌리기 위해 사용됩니다. 재처리도 재활용에 속합니다.

피하다

예외를 직접 처리하지 말고 대신 호출 페이지로 돌아갑니다.

무시하다

예외를 무시하십시오.

변환

확인된 예외를 확인되지 않은 예외로 변환할 수 있습니다.


Checked Exception 사용과 Unchecked Exception 사용에 대한 자신의 원칙은 무엇입니까?

지정되지는 않았지만 Checked Exception의 경우 코드를 제한하여 안정성을 높일 수 있습니다. 그래서 협업 과정에서 코드를 제약할 필요가 있을 때 사용하는 것 같다.

UncheckedException은 런타임 오류가 발생할 때 일반적으로 사용됩니다.


일반적으로 사용되는 예외

IllegalArgumentException

  • 호출자가 부적절한 값을 인수로 전달할 때 사용됩니다.

불법 상태 예외

  • 대상 객체의 상태가 호출된 메서드를 실행하기에 적합하지 않을 때 사용합니다.

NullPointer 예외

  • null을 허용하지 않는 메서드에 null 값을 전달할 때 사용됩니다.

IndexOutOfBount 예외

  • 인덱스가 범위를 벗어날 때 사용합니다.

지원되지 않는 작업 예외

  • 호출된 메서드가 지원되지 않을 때 사용합니다.

나가

예외 처리에 대해 아무것도 몰랐습니다. 이번에 만들어 봤습니다. 예외 처리 문장을 한 줄씩 작성하려면 생각하면서 작성해야 합니다.

그리고 다른 팀에서 사용하는 맞춤 예외를 살펴보겠습니다.