JavaRush /Java Blog /Random-KO /예외: 선택됨, 선택 취소됨 및 사용자 고유

예외: 선택됨, 선택 취소됨 및 사용자 고유

Random-KO 그룹에 게시되었습니다
안녕하세요! 지난 강의에서 우리는 Java 언어의 이러한 측면을 예외로 알게되었고 이에 대한 작업 예를 보았습니다. 오늘 우리는 그들의 구조를 더 깊이 살펴보고, 우리 자신의 예외를 작성하는 방법도 배울 것입니다 :)

예외 유형

앞서 말했듯이 Java에는 거의 400개에 달하는 많은 예외 클래스가 있습니다! 하지만 모두 그룹으로 나누어져 있어서 기억하기가 아주 쉽습니다. 그 모습은 다음과 같습니다. 예외: 선택됨, 선택 취소됨 및 자체 - 2모든 예외에는 공통 조상 클래스가 있습니다 Throwable. 여기에서 예외(Exception)와 오류(Error)라는 두 개의 큰 그룹이 나옵니다. 오류는 JVM(Java Virtual Machine) 작동과 관련된 프로그램 실행 중 발생하는 심각한 오류입니다. 대부분의 경우 Error는 코드에 심각한 결함이 있음을 나타내므로 처리할 필요가 없습니다. 가장 유명한 오류는 다음과 같습니다. StackOverflowError- 예를 들어 메서드가 끝없이 자신을 호출할 때 발생합니다. OutOfMemoryError- 새 객체를 생성할 메모리가 충분하지 않을 때 발생합니다. 보시다시피, 이러한 상황에서는 처리할 특별한 작업이 없는 경우가 대부분입니다. 코드가 잘못 작성되어 다시 작성해야 합니다. 예외는 실제로 예외입니다. 프로그램이 실행되는 동안 발생한 예외적이고 계획되지 않은 상황입니다. 이는 오류만큼 심각한 오류는 아니지만 주의가 필요합니다. 모든 예외는 선택됨( checked )과 선택되지 않음( unchecked ) 의 두 가지 유형으로 나뉩니다 . 예외: 선택됨, 선택 취소됨 및 자체 - 3확인된 모든 예외는 Exception. "검증 가능"은(는) 무슨 뜻인가요? 우리는 지난 강의에서 이에 대해 부분적으로 언급했습니다 . "...Java 컴파일러는 가장 일반적인 예외에 대해 알고 있으며 어떤 상황에서 발생할 수 있는지 알고 있습니다." 예를 들어, 그는 프로그래머가 코드에서 파일의 데이터를 읽는 경우 파일이 존재하지 않는 상황이 쉽게 발생할 수 있다는 것을 알고 있습니다. 그리고 그가 미리 예측할 수 있는 상황도 많이 있습니다. 따라서 컴파일러는 잠재적인 예외가 있는지 미리 코드를 확인합니다. 이를 찾으면 우리가 이를 처리하거나 맨 위로 전달할 때까지 코드를 컴파일하지 않습니다. 두 번째 유형의 예외는 "확인되지 않음"입니다. 그들은 수업에서 왔습니다 RuntimeException. 테스트 대상과 어떻게 다른가요? 특정 런타임 예외 에서 유래하고 이를 설명하는 다양한 클래스도 있는 것 같습니다 RuntimeException. 차이점은 컴파일러가 이러한 오류를 예상하지 않는다는 것입니다. 그는 “코드를 작성할 당시에는 의심스러운 점을 발견하지 못했지만 작동하는 동안 문제가 발생했습니다. 분명히 코드에 오류가 있는 것 같습니다!” 그리고 실제로 그렇습니다. 확인되지 않은 예외는 대부분 프로그래머 오류의 결과입니다. 그리고 컴파일러는 사람들이 스스로 만들 수 있는 모든 잘못된 상황을 확실히 제공할 수는 없습니다. :) 그러므로 우리 코드에서 그러한 예외 처리를 확인하지 않습니다. 이미 확인되지 않은 몇 가지 예외가 발생했습니다.
  • ArithmeticException0으로 나눌 때 발생
  • ArrayIndexOutOfBoundsException배열 외부의 셀에 액세스하려고 할 때 발생합니다.
물론 이론적으로는 Java 작성자가 이러한 예외 처리를 의무적으로 도입할 수도 있었지만 그렇다면 코드는 어떻게 될까요? 숫자 나누기 작업에서 실수로 0으로 나누었는지 확인하기 위해 try-catch를 작성해야 합니까? 배열에 액세스할 때마다 이러한 제한을 초과했는지 확인하기 위해 try-catch를 작성해야 합니다. 작성된 코드는 스파게티 느낌이 나고 전혀 읽을 수 없습니다. 이 아이디어가 포기된 것은 논리적입니다. 따라서 확인되지 않은 예외는 Try-catch 블록에서 처리하거나 맨 위로 던져질 필요가 없습니다. 그러나 이는 Error의 경우처럼 기술적으로 가능합니다.

예외를 발생시키는 방법

물론, Java 개발자가 프로그램에서 발생할 수 있는 모든 예외 상황을 제공할 수는 없습니다. 세상에는 너무 많은 프로그램이 있고, 그것들은 너무 다릅니다. 하지만 괜찮습니다. 필요한 경우 고유한 예외를 만들 수 있기 때문입니다. 이것은 매우 쉽게 수행됩니다. 당신이 해야 할 일은 자신만의 클래스를 만드는 것 뿐입니다. 이름은 "Exception"으로 끝나야 합니다. 컴파일러에는 이것이 필요하지 않지만 코드를 읽는 프로그래머는 이것이 예외 클래스라는 것을 즉시 이해할 것입니다. 또한 클래스가 class 에서 온 것임을 나타내야 합니다 Exception. 이는 컴파일러와 올바른 작동을 위해 이미 필요합니다. 예를 들어 Dog 클래스가 있습니다 Dog. 를 사용하여 개를 산책시킬 수 있습니다 walk(). 하지만 그 전에 우리 애완동물이 목줄, 목줄, 입마개를 착용하고 있는지 확인해야 합니다. 이들 중 하나라도 누락된 경우 자체 예외가 발생합니다 DogIsNotReadyException. 코드는 다음과 같습니다:
public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
클래스가 예외임을 나타내려면 클래스 이름 뒤에 Exception을 확장 해야 합니다 . 이는 "클래스가 Exception 클래스에서 파생됨"을 의미합니다. 생성자에서는 단순히 Exception한 줄로 클래스 생성자를 호출할 것입니다 message. 이는 발생한 오류를 설명하는 시스템의 메시지를 사용자에게 표시합니다. 클래스 코드에서는 다음과 같습니다.
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("Let's go for a walk!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println("Hurrah, let's go for a walk!" + name + " I am glad!");
   } else {
       throw new DogIsNotReadyException("Dog " + name + "not ready for a walk! Check your gear!");
   }
 }

}
이제 우리의 메소드는 walk()예외를 발생시킵니다 DogIsNotReadyException. 이는 키워드를 사용하여 수행됩니다 throw. 앞서 말했듯이 예외는 객체입니다. 따라서 우리 방법에서는 예외적인 상황이 발생하면(개에게 뭔가가 누락된 경우) 새 클래스 개체를 만들고 DogIsNotReadyException단어를 사용하여 프로그램에 넣습니다 throw. 메소드 서명에 walk()throw를 추가합니다 DogIsNotReadyException. 즉, 컴파일러는 이제 메서드 호출로 walk()인해 예외가 발생할 수 있음을 인식합니다. 따라서 프로그램 어딘가에서 이것을 호출하면 예외를 처리해야 합니다. 다음 메소드에서 이를 수행해 보겠습니다 main().
public static void main(String[] args) {

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

   Dog dog = new Dog("Mukhtar");
   dog.putCollar();
   dog.putMuzzle();
   try {
       dog.walk();
   } catch (DogIsNotReadyException e) {
       System.out.println(e.getMessage());
       System.out.println("Checking equipment! Is the collar on?" + dog.isCollarPutOn + "\r\n Is the leash on?"
       + dog.isLeashPutOn + "\r\n Are you wearing a muzzle?" + dog.isMuzzlePutOn);
   }
}
이제 콘솔 출력을 살펴보겠습니다.

Ошейник надет! 
Намордник надет! 
Собираемся на прогулку! 
Собака Мухтар не готова к прогулке! Проверьте экипировку! 
Проверяем снаряжение! Ошейник надет? true
Поводок надет? false 
Намордник надет? true
콘솔 출력이 얼마나 더 많은 정보를 제공하는지 살펴보세요! 우리는 프로그램에서 발생한 모든 단계를 봅니다. 우리는 어디에서 오류가 발생했는지 확인하고 우리 개가 정확히 무엇을 놓치고 있는지 즉시 알아차립니다. :) 이것이 우리가 자체 예외를 만드는 방법입니다. 보시다시피 복잡한 것은 없습니다. 그리고 Java 개발자는 장비가 잘못 된 개에 대해 언어에 특별한 예외를 추가하지 않았지만 그들의 감독을 바로잡았습니다. :)
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION