CodeGym /Java-Blog /Random-DE /Ausnahmen: aktiviert, deaktiviert und benutzerdefiniert
Autor
Volodymyr Portianko
Java Engineer at Playtika

Ausnahmen: aktiviert, deaktiviert und benutzerdefiniert

Veröffentlicht in der Gruppe Random-DE
Hallo! In der letzten Lektion haben wir uns mit Ausnahmen in der Java-Sprache vertraut gemacht und Beispiele für den Umgang mit ihnen gesehen. Heute werfen wir einen tieferen Blick auf die Struktur von Ausnahmen und lernen, wie wir unsere eigenen Ausnahmen schreiben :)

Arten von Ausnahmen

Wie bereits erwähnt, gibt es in Java viele Ausnahmen, fast 400! Aber sie sind alle in Gruppen eingeteilt, sodass man sie sich ziemlich leicht merken kann. So sieht es aus: Ausnahmen: aktiviert, deaktiviert und benutzerdefiniert – 2 Alle Ausnahmen haben einen gemeinsamen Vorfahren in der ThrowableKlasse. Daraus leiten sich zwei Hauptgruppen ab: Ausnahmen ( Exception ) und Fehler ( Error ). Fehler – Dies stellt einen kritischen Laufzeitfehler im Zusammenhang mit dem Betrieb der Java Virtual Machine dar. In den meisten Fällen muss der Fehler nicht behandelt werden, da er auf schwerwiegende Fehler im Code hinweist. Die bekanntesten davon sind StackOverflowError (dies tritt beispielsweise auf, wenn sich eine Methode endlos selbst aufruft) und OutOfMemoryError(Dies geschieht, wenn nicht genügend Speicher zum Erstellen neuer Objekte vorhanden ist). Wie Sie sehen, gibt es in solchen Situationen zur Laufzeit meist überhaupt nichts zu regeln: Der Code ist einfach falsch geschrieben und muss nachbearbeitet werden. Ausnahme – Dies stellt, nun ja, eine Ausnahme dar: eine außergewöhnliche, ungeplante Situation, die auftritt, während das Programm ausgeführt wird. Sie sind nicht so schwerwiegend wie Fehler, erfordern aber dennoch unsere Aufmerksamkeit. Alle Ausnahmen sind in zwei Typen unterteilt: aktiviert und nicht aktiviert . Ausnahmen: aktiviert, deaktiviert und benutzerdefiniert – 3 Alle geprüften Ausnahmen werden von der Klasse abgeleitet Exception. Was bedeutet „geprüft“? Darauf haben wir in der letzten Lektion hingewiesen: „Der Java-Compiler kennt daher die häufigsten Ausnahmen und die Situationen, in denen sie auftreten können.“ Es weiß beispielsweise, dass die Datei möglicherweise nicht existiert, wenn der Code Daten aus einer Datei liest. Und es gibt viele solcher Situationen (auf die man schließen kann). Dementsprechend prüft der Compiler unseren Code vorab auf das Vorhandensein dieser potenziellen Ausnahmen. Wenn sie gefunden werden, wird der Code erst kompiliert, wenn wir sie verarbeitet oder erneut ausgelöst haben. Der zweite Ausnahmetyp ist „ungeprüft“. Sie werden von der RuntimeExceptionKlasse abgeleitet. Wie unterscheiden sie sich von geprüften Ausnahmen? Es scheint, dass es auch viele verschiedene abgeleitete Klassen gibtRuntimeException(die Laufzeitausnahmen beschreiben). Der Unterschied besteht darin, dass der Compiler diese Fehler nicht vorhersieht. Es scheint zu heißen: „Als der Code geschrieben wurde, habe ich nichts Verdächtiges gefunden, aber während der Ausführung ist etwas schiefgelaufen. Offenbar sind Fehler im Code!“ Und das stimmt tatsächlich. Ungeprüfte Ausnahmen sind meist das Ergebnis von Programmierfehlern. Und der Compiler kann offensichtlich nicht jede mögliche schlechte Situation vorhersehen, die Menschen mit ihren eigenen Händen verursachen könnten. :) Daher wird nicht überprüft, ob solche Ausnahmen in unserem Code behandelt werden. Sie sind bereits auf mehrere ungeprüfte Ausnahmen gestoßen:
  • Bei der Division durch Null tritt eine ArithmeticException auf
  • Eine ArrayIndexOutOfBoundsException tritt auf, wenn Sie versuchen, auf eine Position außerhalb des Arrays zuzugreifen.
Natürlich kann man sich vorstellen, dass die Entwickler von Java eine obligatorische Ausnahmebehandlung hätten einführen können, aber in diesem Fall wäre der Code zu kompliziert. Müssen Sie für jede Divisionsoperation einen try-catchBlock schreiben, um zu überprüfen, ob Sie versehentlich durch Null dividiert haben? Jedes Mal, wenn Sie auf ein Array zugreifen, müssen Sie einen try-catchBlock schreiben, um zu überprüfen, ob Ihr Index außerhalb der Grenzen liegt. Alles wäre Spaghetti-Code und völlig unlesbar. Es macht Sinn, dass diese Idee aufgegeben wurde. Daher müssen ungeprüfte Ausnahmen nicht in try-catchBlöcken behandelt oder erneut ausgelöst werden (obwohl dies wie bei Error technisch möglich ist).

So lösen Sie Ihre eigene Ausnahme aus

Natürlich können die Entwickler von Java nicht jede Ausnahmesituation vorhersehen, die in Programmen auftreten kann. Es gibt zu viele Programme auf der Welt und sie sind zu vielfältig. Dies ist jedoch kein Grund zur Sorge, da Sie bei Bedarf Ihre eigene Ausnahme erstellen können. Das geht ganz einfach. Sie müssen lediglich Ihre eigene Klasse erstellen. Sie sollten darauf achten, dass der Name mit „Exception“ endet. Der Compiler benötigt dies nicht, aber andere Programmierer, die Ihren Code lesen, werden sofort erkennen, dass es sich um eine Ausnahmeklasse handelt. Geben Sie außerdem an, dass die Klasse von der ExceptionKlasse geerbt wird (der Compiler erfordert dies). Angenommen, wir haben eine DogKlasse. Wir können mit dem Hund spazieren gehenwalk()Methode. Bevor wir das tun, müssen wir jedoch prüfen, ob unser Haustier ein Halsband, eine Leine und einen Maulkorb trägt. Wenn etwas von dieser Ausrüstung fehlt, lösen wir unsere eigene Ausnahme aus: DogIsNotReadyException . Sein Code sieht so aus:

public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
Um anzuzeigen, dass es sich bei der Klasse um eine Ausnahme handelt, müssen Sie nach dem Klassennamen „ extends Exception “ schreiben (dies bedeutet „die Klasse ist von der Exception-Klasse abgeleitet“). Im Konstruktor rufen wir einfach den ExceptionKlassenkonstruktor mit der String- Nachricht auf (wenn die Ausnahme auftritt, zeigen wir dem Benutzer die Nachricht, eine Beschreibung des Fehlers). So sieht das in unserem Klassencode aus:

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!");
   }
 }

}
Jetzt walk()löst unsere Methode eine DogIsNotReadyException aus . Dies geschieht mit dem Schlüsselwort throw. Wie bereits erwähnt, ist eine Ausnahme ein Objekt. Wenn also in unserer Methode eine Ausnahme auftritt (dem Hund fehlt etwas), erstellen wir ein neues DogIsNotReadyExceptionObjekt und werfen es mit dem Schlüsselwort throw aus. Wir fügen „ throws DogIsNotReadyException “ zur Methodendeklaration hinzu. Mit anderen Worten: Der Compiler ist sich nun bewusst, dass der Aufruf der walk()Methode zu einer Ausnahmesituation werden könnte. Dementsprechend muss diese Ausnahme behandelt werden, wenn wir diese Methode irgendwo in unserem Programm aufrufen. Versuchen wir es mit der main()Methode:

public static void main(String[] args) {
  
   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();// Unhandled exception: DogIsNotReadyException
}
Dies lässt sich nicht kompilieren. Die Ausnahme wird nicht behandelt! Wir packen unseren Code in einen try-catchBlock, um die Ausnahme zu behandeln:

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);
   }
}
Schauen wir uns nun die Konsolenausgabe an: Der Kragen ist dran! Der Maulkorb ist dran! Wir machen uns bereit für einen Spaziergang! Buddy ist nicht bereit für einen Spaziergang! Überprüfen Sie die Ausrüstung! Überprüfen Sie die Ausrüstung! Ist der Kragen angelegt? wahr Ist die Leine angelegt? false Ist der Maulkorb angelegt? wahr Schauen Sie sich an, wie viel informativer die Konsolenausgabe war! Wir sehen jeden Schritt im Programm; Wir sehen, wo der Fehler aufgetreten ist, und können auch sofort genau erkennen, was unserem Hund fehlt. :) Und so erstellen Sie Ihre eigenen Ausnahmen. Wie Sie sehen, ist daran nichts Kompliziertes. Und obwohl sich die Java-Entwickler nicht die Mühe gemacht haben, eine spezielle Ausnahme für schlecht ausgerüstete Hunde in die Sprache aufzunehmen, haben wir ihr Versehen behoben. :) :)
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION