CodeGym /Java Blog /무작위의 /예외: 선택됨, 선택되지 않음 및 사용자 지정
John Squirrels
레벨 41
San Francisco

예외: 선택됨, 선택되지 않음 및 사용자 지정

무작위의 그룹에 게시되었습니다
안녕! 지난 수업에서 우리는 자바 언어의 예외에 대해 알게 되었고 예외를 다루는 방법에 대한 예를 보았습니다. 오늘 우리는 예외의 구조를 더 깊이 살펴보고 우리 자신의 예외를 작성하는 방법을 배울 것입니다 :)

예외 유형

이전에 말했듯이 Java에는 거의 400개에 가까운 많은 예외가 있습니다! 하지만 그것들은 모두 그룹으로 나누어져 있어서 기억하기가 상당히 쉽습니다. 모든 예외 는 클래스 예외: 선택됨, 선택되지 않음 및 사용자 지정 - 2 에서 공통 조상을 가집니다 Throwable. 여기에서 예외( Exception ) 및 오류( Error )라는 두 가지 주요 그룹이 파생됩니다. 오류 - JVM(Java Virtual Machine) 작동과 관련된 심각한 런타임 오류를 나타냅니다. 대부분의 경우 오류는 코드에 심각한 결함이 있음을 나타내므로 처리할 필요가 없습니다. 이 중 가장 유명한 것은 StackOverflowError (예를 들어 메서드가 끝없이 자신을 호출할 때 발생) 및 OutOfMemoryError 입니다.(메모리가 부족하여 새 객체를 생성할 수 없을 때 발생합니다.) 보시다시피 이러한 상황에서는 일반적으로 런타임에 처리할 것이 전혀 없습니다. 코드는 단순히 잘못 작성되어 재작업이 필요합니다. 예외 - 이것은 예외를 나타냅니다. 프로그램이 실행되는 동안 발생하는 예외적이고 계획되지 않은 상황입니다. 오류만큼 심각하지는 않지만 여전히 주의를 기울여야 합니다. 모든 예외는 2가지 유형으로 나뉩니다: checkedunchecked . 예외: 선택됨, 선택되지 않음 및 사용자 지정 - 3 모든 확인된 예외는 클래스에서 파생됩니다 Exception. "checked"은(는) 무슨 뜻인가요? 지난 수업에서 이에 대해 언급했습니다. "따라서 Java 컴파일러는 가장 일반적인 예외와 이러한 예외가 발생할 수 있는 상황을 알고 있습니다." 예를 들어 코드가 파일에서 데이터를 읽으면 파일이 쉽게 존재하지 않을 수 있음을 알고 있습니다. 그리고 그러한 상황(추론할 수 있음)이 많이 있습니다. 따라서 컴파일러는 이러한 잠재적 예외가 있는지 미리 코드를 확인합니다. 그것들을 찾으면 우리가 그것들을 처리하거나 다시 던질 때까지 코드를 컴파일하지 않을 것입니다. 두 번째 예외 유형은 "확인되지 않음"입니다. 클래스 에서 파생됩니다 RuntimeException. 확인된 예외와 어떻게 다릅니까? 에서 파생된 다양한 클래스도 많이 있는 것 같습니다.RuntimeException(런타임 예외를 설명함). 차이점은 컴파일러가 이러한 오류를 예상하지 않는다는 것입니다. "코드를 작성할 때 의심스러운 점을 찾지 못했지만 실행하는 동안 문제가 발생했습니다. 분명히 코드에 오류가 있습니다!" 그리고 실제로 이것은 사실입니다. 확인되지 않은 예외는 대부분 프로그래머 오류의 결과입니다. 그리고 컴파일러는 분명히 사람들이 자신의 손으로 만들 수 있는 모든 가능한 나쁜 상황을 예측할 수 없습니다. :) 따라서 이러한 예외가 우리 코드에서 처리되는지 여부를 확인하지 않습니다. 확인되지 않은 몇 가지 예외가 이미 발생했습니다.
  • 0으로 나누면 ArithmeticException이 발생합니다.
  • 배열 외부 위치에 액세스하려고 하면 ArrayIndexOutOfBoundsException이 발생합니다.
물론 Java 작성자가 필수 예외 처리를 도입했을 수도 있지만 이 경우 코드가 너무 복잡해집니다. try-catch나누기 연산의 경우 실수로 0으로 나누었는지 확인하기 위해 블록을 작성해야 합니까 ? try-catch배열에 액세스할 때마다 인덱스가 범위를 벗어났는지 확인하기 위해 블록을 작성해야 합니다 . 모든 것이 스파게티 코드일 것이고 완전히 읽을 수 없을 것입니다. 이 아이디어가 버려졌다는 것은 이치에 맞습니다. 결과적으로 확인되지 않은 예외는 블록에서 처리하거나 다시 throw할 필요가 없습니다 try-catch(Error와 같이 기술적으로 가능하지만).

자신의 예외를 던지는 방법

물론 Java 제작자가 프로그램에서 발생할 수 있는 모든 예외적인 상황을 예측할 수는 없습니다. 세상에는 너무 많은 프로그램이 있고 너무 다양합니다. 그러나 필요한 경우 고유한 예외를 만들 수 있으므로 걱정할 사항이 아닙니다. 이것은 매우 쉽습니다. 자신만의 클래스를 생성하기만 하면 됩니다. 이름이 "Exception"으로 끝나는지 확인해야 합니다. 컴파일러에는 이것이 필요하지 않지만 코드를 읽는 다른 프로그래머는 예외 클래스임을 즉시 이해할 것입니다. 또한 클래스가 Exception클래스에서 상속됨을 나타냅니다(컴파일러에서 이를 요구함). 예를 들어 클래스가 있다고 가정합니다 Dog. 우리는 다음을 사용하여 개를 산책시킬 수 있습니다.walk()방법. 하지만 그 전에 우리는 애완동물이 목줄, 목줄, 입마개를 착용하고 있는지 확인해야 합니다. 이 장비 중 누락된 것이 있으면 예외가 발생합니다: DogIsNotReadyException . 코드는 다음과 같습니다.

public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
클래스가 예외임을 표시하려면 클래스 이름 뒤에 " extends Exception " 을 작성해야 합니다 (이는 "클래스가 Exception 클래스에서 파생됨"을 의미함). 생성자에서 ExceptionString 메시지 로 클래스 생성자를 호출하기만 하면 됩니다(예외가 발생하면 오류에 대한 설명 메시지를 사용자에게 표시함). 클래스 코드에서 다음과 같이 표시됩니다.

public class Dog {

   String name;
   boolean isCollarPutOn;
   boolean isLeashPutOn;
   boolean isMuzzlePutOn;


   public Dog(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

   }

   public void putCollar() {

       System.out.println("The collar is on!");
       this.isCollarPutOn = true;
   }

   public void putLeash() {

       System.out.println("The leash is on!");
       this.isLeashPutOn = true;
   }

   public void putMuzzle() {
       System.out.println("The muzzle is on!");
       this.isMuzzlePutOn = true;
   }

   public void walk() throws DogIsNotReadyException {

   System.out.println("We're getting ready for a walk!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println("Hooray, let's go for a walk! " + name + " is very happy!");
   } else {
       throw new DogIsNotReadyException(name + " is not ready for a walk! Check the gear!");
   }
 }

}
이제 우리 메서드는 DogIsNotReadyExceptionwalk() 을 던집니다 . 이것은 throw 키워드로 수행됩니다. 앞에서 말했듯이 예외는 개체입니다. 따라서 우리 메서드에서 예외가 발생하면(개가 무언가를 놓치고 있음) 키워드 throw를 사용하여 새 개체를 만들고 던집니다. 메서드 선언에 " throws DogIsNotReadyException "을 추가합니다 . 즉, 이제 컴파일러는 메서드 호출이 예외적인 상황이 될 수 있음을 인식합니다. 따라서 프로그램 어딘가에서 이 메서드를 호출하면 이 예외를 처리해야 합니다. 메소드 에서 이것을 해보자 : DogIsNotReadyExceptionwalk()main()

public static void main(String[] args) {
  
   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();// Unhandled exception: DogIsNotReadyException
}
이것은 컴파일되지 않습니다. 예외가 처리되지 않습니다! try-catch예외를 처리하기 위해 코드를 블록으로 래핑합니다 .

public static void main(String[] args) {

   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   try {
       dog.walk();
   } catch (DogIsNotReadyException e) {
       System.out.println(e.getMessage());
       System.out.println("Checking the gear! Is the collar on? " + dog.isCollarPutOn + "\r\n Is the leash on? "
       + dog.isLeashPutOn + "\r\n Is the muzzle on? " + dog.isMuzzlePutOn);
   }
}
이제 콘솔 출력을 살펴보겠습니다. The collar is on! 총구가 켜져 있습니다! 우리는 산책을 준비하고 있습니다! 버디는 산책할 준비가 되어 있지 않습니다! 기어를 확인하세요! 기어 확인! 칼라가 켜져 있습니까? 가죽 끈이 켜져 있습니까? false 총구가 켜져 있습니까? true 콘솔 출력이 얼마나 더 유익한지 보십시오! 우리는 프로그램의 모든 단계를 봅니다. 우리는 오류가 발생한 위치를 확인하고 우리 강아지가 무엇을 놓치고 있는지 즉시 확인할 수 있습니다. :) 이것이 바로 자신만의 예외를 만드는 방법입니다. 보시다시피 복잡한 것은 없습니다. 그리고 Java의 제작자가 장비가 부족한 개에 대한 특별한 예외를 언어에 포함하지 않았음에도 불구하고 우리는 그들의 감독을 수정했습니다. :)

더 읽어보기:

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION