JavaRush /Java-Blog /Random-DE /Ausnahmen: aktiviert, deaktiviert und Ihre eigenen

Ausnahmen: aktiviert, deaktiviert und Ihre eigenen

Veröffentlicht in der Gruppe Random-DE
Hallo! In der letzten Vorlesung haben wir einen Aspekt der Java-Sprache wie Ausnahmen kennengelernt und Beispiele für die Arbeit mit ihnen gesehen. Heute werden wir uns ihre Struktur genauer ansehen und lernen, wie wir unsere eigenen Ausnahmen schreiben :)

Arten von Ausnahmen

Wie gesagt, es gibt in Java viele Ausnahmeklassen, fast 400! Aber sie sind alle in Gruppen eingeteilt, sodass man sie sich leicht merken kann. So sieht es aus: Ausnahmen: aktiviert, nicht aktiviert und Ihre eigenen – 2Alle Ausnahmen haben eine gemeinsame Vorfahrenklasse Throwable. Daraus ergeben sich zwei große Gruppen – Ausnahmen (Exception) und Fehler (Error). Ein Fehler ist ein kritischer Fehler während der Programmausführung im Zusammenhang mit dem Betrieb der Java Virtual Machine. In den meisten Fällen muss der Fehler nicht behandelt werden, da er auf schwerwiegende Fehler im Code hinweist. Die bekanntesten Fehler: StackOverflowError- treten beispielsweise auf, wenn sich eine Methode endlos selbst aufruft, und OutOfMemoryError- treten auf, wenn nicht genügend Speicher zum Erstellen neuer Objekte vorhanden ist. Wie Sie sehen, gibt es in solchen Situationen meist nichts Besonderes zu verarbeiten – der Code ist einfach falsch geschrieben und muss überarbeitet werden. Ausnahmen sind tatsächlich Ausnahmen: eine außergewöhnliche, ungeplante Situation, die während der Ausführung des Programms eintrat. Dies sind keine so schwerwiegenden Fehler wie Fehler, aber sie erfordern unsere Aufmerksamkeit. Alle Ausnahmen sind in zwei Typen unterteilt: aktiviert ( geprüft ) und ungeprüft ( ungeprüft ). Ausnahmen: aktiviert, nicht aktiviert und Ihre eigenen – 3Alle geprüften Ausnahmen stammen aus der Exception. Was bedeutet „nachweisbar“? Wir haben dies in der letzten Vorlesung teilweise erwähnt : „...der Java-Compiler kennt die häufigsten Ausnahmen und weiß, in welchen Situationen sie auftreten können.“ Er weiß zum Beispiel, dass, wenn ein Programmierer Daten aus einer Datei im Code liest, leicht die Situation entstehen kann, dass die Datei nicht existiert. Und es gibt viele solcher Situationen, die er im Voraus vorhersagen kann. Daher prüft der Compiler unseren Code vorab auf mögliche Ausnahmen. Wenn sie gefunden werden, wird der Code erst dann kompiliert, wenn wir sie verarbeiten oder an die Spitze weiterleiten. Die zweite Ausnahmeart ist „ungeprüft“. Sie kommen aus der Klasse RuntimeException. Wie unterscheiden sie sich von den getesteten? Es scheint, dass es auch eine Reihe verschiedener Klassen gibt, die aus RuntimeExceptionbestimmten Laufzeitausnahmen stammen und diese beschreiben. Der Unterschied besteht darin, dass der Compiler diese Fehler nicht erwartet. Er scheint zu sagen: „Als ich den Code geschrieben habe, habe ich nichts Verdächtiges gefunden, aber während der Arbeit ist etwas schiefgelaufen.“ Anscheinend sind Fehler im Code!“ Und das ist es tatsächlich. Ungeprüfte Ausnahmen sind meist das Ergebnis von Programmierfehlern. Und der Compiler ist offensichtlich nicht in der Lage, alle möglichen fehlerhaften Situationen zu berücksichtigen, die Menschen mit ihren eigenen Händen erstellen können :) Daher wird die Behandlung solcher Ausnahmen in unserem Code nicht überprüft. Sie sind bereits auf mehrere ungeprüfte Ausnahmen gestoßen:
  • ArithmeticExceptiontritt auf, wenn durch Null geteilt wird
  • ArrayIndexOutOfBoundsExceptionTritt auf, wenn versucht wird, auf eine Zelle außerhalb des Arrays zuzugreifen.
Theoretisch hätten die Entwickler von Java natürlich eine obligatorische Behandlung solcher Ausnahmen einführen können, aber was würde dann aus dem Code werden? Bei jeder Operation zum Teilen von Zahlen müssten Sie einen Try-Catch schreiben, um zu überprüfen, ob Sie versehentlich durch Null dividieren? Bei jedem Zugriff auf ein Array müssten Sie einen Try-Catch schreiben, um zu überprüfen, ob Sie diese Grenzen überschritten haben. Jeder geschriebene Code wäre Spaghetti und völlig unlesbar. Es ist logisch, dass diese Idee aufgegeben wurde. Daher müssen ungeprüfte Ausnahmen nicht in Try-Catch-Blöcken behandelt oder nach oben geworfen werden, obwohl dies wie bei Error technisch möglich ist.

So lösen Sie Ihre Ausnahme aus

Natürlich sind die Entwickler von Java nicht in der Lage, alle Ausnahmesituationen zu berücksichtigen, die in Programmen auftreten können. Es gibt zu viele Programme auf der Welt und sie sind zu unterschiedlich. Aber das ist in Ordnung, denn Sie können bei Bedarf eigene Ausnahmen erstellen. Das geht ganz einfach. Sie müssen lediglich Ihre eigene Klasse erstellen. Sein Name muss mit „Exception“ enden. Der Compiler benötigt dies nicht, aber Programmierer, die Ihren Code lesen, werden sofort verstehen, dass es sich um eine Ausnahmeklasse handelt. Darüber hinaus müssen Sie angeben, dass die Klasse aus der Klasse stammt Exception. Dies ist bereits für den Compiler und den korrekten Betrieb notwendig. Zum Beispiel haben wir eine Klasse Dog - Dog. Wir können mit dem Hund spazieren gehen walk(). Zuvor müssen wir jedoch prüfen, ob unser Haustier Halsband, Leine und Maulkorb trägt. Wenn eines davon fehlt, lösen wir unsere eigene Ausnahme aus DogIsNotReadyException. Sein Code wird so aussehen:
public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
Um anzuzeigen, dass eine Klasse eine Ausnahme ist, müssen Sie „extends Exception“ nach dem Klassennamen schreiben: Dies bedeutet, dass „die Klasse von der Klasse Exception abgeleitet ist“. Im Konstruktor rufen wir einfach den Klassenkonstruktor Exceptionmit einer Zeile auf message– er zeigt dem Benutzer eine Meldung des Systems an, die den aufgetretenen Fehler beschreibt. So wird es in unserem Klassencode aussehen:
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(„Der Kragen ist angelegt!“);
       this.isCollarPutOn = true;
   }

   public void putLeash() {

       System.out.println(„Die Leine ist angelegt!“);
       this.isLeashPutOn = true;
   }

   public void putMuzzle() {
       System.out.println(„Der Maulkorb ist an!“);
       this.isMuzzlePutOn = true;
   }

   public void walk() throws DogIsNotReadyException {

   System.out.println("Lass uns spazieren gehen!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println(„Hurra, lass uns spazieren gehen!“ + name + " sehr froh!");
   } else {
       throw new DogIsNotReadyException("Hund " + name + „Nicht bereit für einen Spaziergang! Überprüfen Sie Ihre Ausrüstung!“);
   }
 }

}
Jetzt löst unsere Methode walk()eine Ausnahme aus DogIsNotReadyException. Dies geschieht mit dem Schlüsselwort throw. Wie bereits erwähnt, ist eine Ausnahme ein Objekt. Deshalb erstellen wir in unserer Methode, wenn eine Ausnahmesituation eintritt – dem Hund fehlt etwas – ein neues Klassenobjekt DogIsNotReadyExceptionund werfen es mit dem Wort in das Programm throw. walk()Wir fügen der Methodensignatur Würfe hinzu DogIsNotReadyException. Mit anderen Worten: Der Compiler weiß nun, dass ein Methodenaufruf walk()zu einer Ausnahme führen kann. Wenn wir dies also irgendwo im Programm aufrufen, muss die Ausnahme behandelt werden. Versuchen wir dies in der Methode zu tun main():
public static void main(String[] args) {

   Dog dog = new Dog(„Mukhtar“);
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();//Unhandled exception: DogIsNotReadyException
}
Kompiliert nicht, Ausnahme wird nicht behandelt! Lassen Sie uns unseren Code in einen Block einschließen try-catch, um die Ausnahme zu behandeln:
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(„Überprüfe Ausrüstung! Ist das Halsband angelegt?“ + dog.isCollarPutOn + „\r\nIst die Leine angelegt?“
       + dog.isLeashPutOn + „\r\n Trägst du einen Maulkorb?“ + dog.isMuzzlePutOn);
   }
}
Schauen wir uns nun die Konsolenausgabe an:

Ошейник надет! 
Намордник надет! 
Собираемся на прогулку! 
Собака Мухтар не готова к прогулке! Проверьте экипировку! 
Проверяем снаряжение! Ошейник надет? true
Поводок надет? false 
Намордник надет? true
Schauen Sie, wie viel informativer die Konsolenausgabe geworden ist! Wir sehen jeden Schritt, der im Programm passiert ist; Wir sehen, wo der Fehler aufgetreten ist und merken sofort, was genau unserem Hund fehlt :) So erstellen wir unsere eigenen Ausnahmen. Wie Sie sehen, nichts Kompliziertes. Und obwohl sich die Java-Entwickler nicht die Mühe gemacht haben, ihrer Sprache eine spezielle Ausnahme für falsch ausgerüstete Hunde hinzuzufügen, haben wir ihr Versehen korrigiert :)
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION