JavaRush /Java-Blog /Random-DE /Ausnahmen in Java
Roman
Level 33

Ausnahmen in Java

Veröffentlicht in der Gruppe Random-DE
Als ich auf das Thema „Ausnahmen“ stieß, tauchten viele Fragen auf, auf die ich in verschiedenen Ecken des Internets nach Antworten suchen musste, um die Funktionsweise im Detail zu verstehen. Aus diesem Grund habe ich meine eigene Erklärung zusammengestellt, die für Anfänger, die gerade erst auf dieses Phänomen gestoßen sind, möglicherweise verständlicher ist. Ausnahmen in Java - 1In Computern ist ein Interrupt ein eingehendes Signal an den Prozessor, dass ein Ereignis auftritt, das eine sofortige Reaktion erfordert. Ein Interrupt-Signal fordert den Prozessor auf, ein laufendes Programm anzuhalten, damit es etwas später fortgesetzt werden kann, d. h. der Computer muss sich alle mit der Ausführung des Programms verbundenen Informationen merken. Solche Unterbrechungen sind vorübergehend, wenn nicht sogar tödlich. Solche Unterbrechungen können entweder durch Programmcode oder durch bestimmte Hardwarefunktionen verursacht werden (z. B. einfaches Drücken von Tasten auf der Tastatur; Timer, z. B. zum automatischen Ausschalten des Computers). Die Anzahl der Interrupts ist auf eine bestimmte Anzahl begrenzt, die in die Produktion eines bestimmten Prozessors integriert ist, d. h. dafür werden spezielle Kommunikations-„Kanäle“ zugewiesen, die es Ihnen ermöglichen, unter Umgehung aller anderen Prozesse auf den Prozessor zuzugreifen. Interrupts werden auch automatisch generiert, wenn im ausführenden Programmcode ein Fehler auftritt (z. B. wenn eine Division durch Null auftritt). Solche Unterbrechungen werden traditionell als Fallen oder Ausnahmen bezeichnet . In solchen Fällen ist es üblich zu sagen: „Eine Ausnahme wurde ausgelöst“, d. h. eine Ausnahme wurde ausgelöst oder eine Ausnahme wurde geworfen (geworfen), d. h. eine Anforderung für einen Interruptmit der Frage „Was tun?“ an den Bearbeiter gesendet. In diesem Moment hört der Prozessor auf zu arbeiten und merkt sich den Punkt, an dem er aufgehört hat, bzw. den Cluster der nächsten Zelle, von der aus die Informationen ausgeführt werden müssen. Die gesamte Kette ausgeführter und NICHT ausgeführter Anweisungen wird gespeichert. Anschließend liest der Prozessor Anweisungen aus dem Speicher, um im Falle eines solchen Fehlers Maßnahmen zu ergreifen. Gemäß dieser Anweisung kann es neue Werte in bestimmte Cluster eingeben, einige Aktionsketten oder einen neuen Zyklus (z. B. einen Rück- oder Schleifenzyklus) usw. hinzufügen, also je nach zuvor gelegtem Fehler Abwärtsbefehle werden ausgeführt. Im Computersystem selbst sind viele automatische Interrupts eingebaut, die nach einer bestimmten Zeit ausgelöst werden, um beispielsweise auf dem Computer laufende Prozesse zu steuern oder Alarme einzustellen, eingehende externe Signale zu sammeln und verschiedene Datenkonverter durchzuführen. Es sei daran erinnert, dass eine große Anzahl von Interrupts aus verschiedenen Gründen dazu führen kann, dass das System vollständig „hängt“. Ein Fehler im Programmcode führt automatisch zu einer Unterbrechung des Prozessors, der versucht, den vorgegebenen Anweisungen entsprechend abzuarbeiten. Aber nicht alle Interrupts sind dafür ausgelegt, sie zu verarbeiten, oder es kann zu einer Prozedur kommen, die für uns nicht geeignet ist, z. B. führt sie einfach zum Absturz der Anwendung. Daher ist es beim Programmieren möglich, einen eigenen Interrupt für einen bestimmten Codeabschnitt zu organisieren, in dem der Programmierer möglicherweise die Möglichkeit eines Fehlers sieht. In diesem Fall wird der Fehler innerhalb des Programms verarbeitet und es erfolgt keine Kontaktaufnahme mit dem Prozessor zur Verarbeitung von Anweisungen. Die Definition solcher Blöcke wird durch die Erstellung eines „Exception“ -Objekts organisiert . Dieses Objekt wird automatisch im Block erstellt try-catch. Der Block >trywird auf das Vorhandensein eines Fehlers überprüft und, falls vorhanden, geht das Programm zum Block über catch, wo Maßnahmen ergriffen werden, um den Fehler zu verhindern oder auszugleichen. Wenn wir zum Beispiel Zahlen über die Tastatur eingeben , die anschließend addiert und subtrahiert werden müssen, dann macht die Eingabe von Buchstaben über die Tastatur es unmöglich, sie mit Zahlen zu addieren (die Summe dieser beiden Variablen bezeichnen wir mit dem Buchstaben S). Daher müssen wir als Team tryprüfen, ob die Zahl A, die Zahlen enthält, zur Zahl B, die Buchstaben enthält, hinzugefügt werden kann (das heißt, S = A + B), und wenn dies nicht möglich und unmöglich ist, dann sicher Es müssen Maßnahmen ergriffen werden, damit keine Fehler auftreten und kein neuer Interrupt mit der Frage „Was tun?“ zum Prozessor fliegt. Wenn im Programm keine Ausnahme vorliegt, wird seine Ausführung vom Prozessor unterbrochen. Wenn es eine Ausnahme gibt und diese vom Befehl „abgefangen“ wird try, geht die Kontrolle an den Befehl über catch, der eine alternative Lösung festlegen kann. Beispielsweise werden wir diese beiden Zahlen nicht addieren, sondern S = A festlegen.
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 } catch (Exception igogo1) {
   S = a;
 }
 return S;
/* string „int r = 1;“ wird nicht ausgeführt, weil ein Fehler aufgetreten ist und das Programm die Arbeit direkt an den Ausnahmehandler (catch-Block*/) umleitet. Daher ist das Vorhandensein von Ausnahmen eine Gelegenheit, das Problem innerhalb des Programms zu lösen, ohne es auf Prozessorebene auszulösen. Das „Exception“-Objekt, das bei Erkennung eines Fehlers automatisch im Baustein angelegt wird try, enthält den Wert des Fehlertyps. Nennen wir es „OurException“ – für unseren speziellen Fall mit einer Beschreibung unseres spezifischen Fehlers. Die Ersteller der Java-Sprache haben im Voraus eine bestimmte Liste typischer Fehler und typische Optionen zu deren Korrektur erstellt. Das heißt, in Java gibt es eine bestimmte Ausnahmebibliothek , auf die wir zurückgreifen können, um einen aufgetretenen Fehler zu behandeln Wir schreiben den Verarbeitungscode nicht selbst und daher ist OurException höchstwahrscheinlich bereits von jemandem beschrieben worden. Wir müssen also nur den Namen dieser Ausnahmen kennen, die wir in unser Programm einfügen müssen, um den Code zu verarbeiten, bei dem möglicherweise ein Fehler auftreten könnte. Wenn wir einen Fehler machen und eine falsche Ausnahme aus der Bibliothek auswählen , wird sie vom Handler nicht „abgefangen“, der Fehler findet keine Lösung im Programm und die Anfrage wird an den Prozessor gesendet. Aber es gibt einen Weg für die Faulen. Wenn wir den Namen der benötigten Ausnahme aus der Bibliothek nicht kennen, können wir wie im oben beschriebenen Beispiel die allgemeine mit dem Namen „ Exception “ nehmen. Diese Ausnahme ist in der Lage, jede Art von Fehler zu behandeln, sie ist jedoch nicht in der Lage, spezifische Informationen über den Vorfall bereitzustellen, die wir protokollieren könnten. Die Bibliothek zuvor geschriebener Ausnahmen besteht aus aktivierten und nicht aktivierten Ausnahmen . Überprüfbar sind solche, die korrigiert werden können, ohne die Arbeit des Programms zu unterbrechen. Das heißt, wenn wir versuchen, eine Datei in einem Ordner zu öffnen, in dem sie nicht vorhanden ist, teilt uns das System dies mit und wir können die Datei löschen in den gewünschten Ordner kopieren und das Programm fortsetzen. Das heißt, tatsächlich wurde eine Interrupt -Anfrage an den Prozessor gesendet , jedoch ohne die Frage: „Suchen Sie, was Sie gegen dieses Problem tun können?!?!“ Wir haben einen von uns selbst erkannten Interrupt mit einer vorgefertigten Anweisung gesendet, die der Prozessor verarbeitet und mit der Ausführung des Programms fortsetzt. Nicht aktiviert sind Fehler, die nicht korrigiert werden können und bei denen das Programm vor Abschluss geschlossen wird, d. h. es wird eine Interrupt- Anfrage an den Prozessor gesendet, was in jedem Fall die Ausführung des Programms unterbricht. Der einzige Sinn beim Schreiben solcher Ausnahmen im Programm besteht darin, dem Benutzer verständlich zu machen, was passiert ist, da wir, nachdem wir diese Unterbrechung erkannt haben, eine Informationsmeldung auf dem Bildschirm anzeigen können, aufgrund derer das Programm abgestürzt ist. Der zweite Grund, solche Unterbrechungen abzufangen, ist die Möglichkeit, sie zur späteren Analyse in den Protokollen aufzuzeichnen (Sie wurden gehackt, wissen aber zumindest, wo). Eine Folge der Präsenz solcher Bibliotheken ist die Notwendigkeit, daran zu denken, sie einzubeziehen. (Eine Liste der aktivierten und nicht aktivierten Ausnahmen mit Bibliotheken finden Sie beispielsweise hier . ) Wenn wir nicht genau wissen, welche Bibliothek wir einschließen sollen oder es mehrere Fehleroptionen gibt, können wir catchdie erforderlichen Ausnahmen in mehreren auflisten. Das System selbst wählt den richtigen Handler aus, wenn dieser in der Liste enthalten ist. Anstelle einer bestimmten Ausnahme können Sie eine allgemeine „ Ausnahme “ schreiben, die jede Art von Ausnahme behandeln kann , wenn sie in vorherigen Blöcken nicht verarbeitet wurde.
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 }
catch(NullPointerException blabla2) {
   System.out.println("Exception handling code for the NullPointerException.");
 }
catch (ArithmeticException ex1) {
   S = a;
 }
catch(Exception uups1) {
   System.out.println("Exception occured");
 }
 return S;
Wenn ein Block vorhanden ist, trywird automatisch eine Ausnahme erstellt. Wenn wir zu einem bestimmten Zeitpunkt eine Ausnahme erzwingen müssen , wird der Befehl verwendet throw. Das heißt, wir erstellen selbstständig ein Objekt new throw... Danach stoppt das Programm seine Arbeit, sendet eine Interrupt- Anfrage an den Prozessor und wird in den Programmabschnitt weitergeleitet catch, von wo aus es versucht, Anweisungen für weitere Aktionen zu erhalten. Durch manuelles Erstellen einer Exception können wir ihren spezifischen Typ aus der Bibliothek angeben:

throw new ArithmeticException("Access denied - You must be at least 18 years old.");
Dann sucht der Handler nach einem Block catchmit dieser bestimmten Ausnahme – durchsucht das gesamte Programm auf allen Seiten catch. Nach dem throwBefehl zur Ausnahmebehandlung wird der gesamte verbleibende Programmcode NICHT ausgeführt, außer dem, der sich im Block befindet catch. Wenn der Handler nicht im Programm gefunden wird, wird dem Prozessor die Frage gestellt: „Entscheiden Sie selbst, was zu tun ist“ und er unterbricht das Programm. Der Aufruf ... kann sowohl innerhalb als auch außerhalb des Blocks (irgendwo im Programm) new throwerfolgen.>try
try {
   /* функция oder действие, в котором есть сомнения. То есть: «попробуй выполнить это, а если не получится, а, если не получится, запускай режим исключения» */
   throw new CallForException(); /* Назначаем исключение, которое будет работать в случае наличия ошибки в функции, описанной выше. Здесь исключение «CallForException» - берется из библиотеки существующих исключений */
} catch (CallForException ee1) {
   /* Корректируем ошибку, чтобы программа не «отвалилась» oder выводим сообщение об ошибке oder что-то ещё */
} finally {
   /* этот блок работает всегда независимо от того была ошибка oder нет. А если была, то сработало ли решение в catch oder нет */
   /* часто используется для подчистки хвостов, например, для закрытия запущенного Datei oder базы данных */
   /* в ряде случаев блок catch вообще может быть опущен и оставлен только блок finally и наоборот finally может быть опущен и оставлен только catch */
   /* Не допускается использование этого блока в ряде случаев, например, когда функция System.exit() запущена oder другие системные Исключения, типа «отключение электроэнергии» и т.п. */
}

Benachrichtigung über Ausnahmen

Methoden, die zuvor von jemandem geschrieben wurden, können das Auslösen von Ausnahmen umfassen. Um auf der sicheren Seite zu sein, warnte der Programmierer, der den Code geschrieben hat, nachfolgende Programmierer, dass in der von ihm geschriebenen Methode ein Fehler auftreten könnte. So sieht beispielsweise die unten beschriebene Dateierstellungsmethode vor, dass beim Erstellen einer Datei ein Fehler auftreten kann (es gibt keine Datei im angegebenen Pfad), was bedeutet, dass ein Fehlerhandler erforderlich ist:
public void createFile(String path, String text) throws IOException {
    FileWriter writer = new FileWriter(path, true);
    writer.write(text);
    writer.close();
}
Gleichzeitig gibt es aber keinen Handler selbst, was bedeutet, dass wir die geschriebene Methode in unserem Programm jetzt nicht einfach im normalen Modus aufrufen können. Jetzt müssen wir einen Fehlerhandler schreiben und diese Methode im Block aufrufen try:
String filePath = "hello.txt";
String text = "Hello World";

try {
    createFile(filePath, text);
} catch (IOException ex) {
    System.err.println("Error creating file: " + ex);
}

Native Ausnahmen

Es ist möglich, eigene Ausnahmen zu schreiben, um bestimmte Fehler zu behandeln, wenn uns die vorhandenen Bibliotheken nicht ausreichen. Dazu erstellen wir einfach eine Klasse, die von der Exception-Klasse erbt
public class StudentNotFoundException extends Exception {

    public StudentNotFoundException (String message) {
        super(message);
    }
}
Beim Erstellen eigener Ausnahmen sind zwei Regeln zu beachten:
  1. Unser Klassenname muss mit „Exception“ enden.
  2. Die Klasse muss einen Konstruktor mit einer Zeichenfolgenvariablen enthalten, die die Details des Ausnahmeproblems beschreibt. Im Konstruktor wird der Superkonstruktor aufgerufen und eine Nachricht übergeben.
Ein Beispiel für die Verwendung der generierten Ausnahme:
public class StudentManager {
    public Student find(String studentID) throws StudentNotFoundException {
        if (studentID.equals("123456")) {
            return new Student();
        } else {
            throw new StudentNotFoundException(
                "Could not find student with ID " + studentID);
        }
    }
}
Wir fangen diese Ausnahme mit dem Code ab:
public class StudentTest {
    public static void main(String[] args) {
        StudentManager manager = new StudentManager();
         try {
            Student student = manager.find("0000001");
        } catch (StudentNotFoundException ex) {
            System.err.print(ex);
        }
    }
}
Das Ergebnis der Ausführung des Programms ist: StudentNotFoundException: Student mit ID 0000001 konnte nicht gefunden werden

Warum müssen Sie Ausnahmen schreiben?

Im Jahr 1996 stürzte die Ariane-5 -Rakete aufgrund einer falschen Konvertierung einer Float-Variablen in eine Integer-Variable ab. Für diese Situation gab es keine Ausnahmen oder Handler. Wenn beim Herunterladen einer Datei die Verbindung zum Internet unterbrochen wird, können Sie aufgrund einer Ausnahme den Download fortsetzen, nachdem die Verbindung wiederhergestellt wurde. Wenn keine Ausnahme vorliegt, muss der Download erneut gestartet werden.

Verweise:

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION