Dieser Artikel ist eine Aufzeichnung dessen, was ich für diejenigen verstehe, die Java studieren.
Die Java-Funktionen und Beschreibungsmethoden werden in der folgenden Liste beschrieben. Diesmal ist es Ausnahmebehandlung.
Die Idee der Ausnahmebehandlung besteht darin, die Antwort im Voraus zu beschreiben, falls ein unerwartetes Verhalten im Code auftritt und eine Ausnahme auftritt.
Eine Ausnahme ist ein anomales Ereignis während der Programmausführung. Es wird häufig mit Fehler gemischt, ist jedoch völlig anders. Fehler ist ein abnormales Ereignis, das selbst auf einer virtuellen Maschine nicht behandelt werden kann, und es wird zwangsweise beendet, sodass die Ausnahmebehandlung nicht damit umgehen kann. Mit Ausnahmen können Sie mit dem Programm fortfahren, ohne den Vorgang zu beenden.
Ich werde die try ~ catch-Anweisung erklären.
class Main{
public static void main(String args[]){
try{
int[] array = {0,1,2};
System.out.println(array[3]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Ich habe eine Ausnahme");
}
}
}
Die obige Beschreibung ist in Form von try ~ catch. Wenn als Mechanismus dieselbe Ausnahme wie die catch-Klasse in try and catch auftritt, wird die Ausnahmeanweisung an catch (Ausnahmeanweisung) übergeben, und der Inhalt von catch funktioniert. Es ist leicht zu verstehen, wenn Sie denken, dass es fast so ist.
Wenn Sie kompilieren und ausführen
Ich habe eine Ausnahme
Wird angezeigt. Der Inhalt des Fangs bewegt sich.
Aktivierte Ausnahmen sind Ausnahmeverarbeitungen, die für die Verarbeitung verwendet werden und nur funktionieren, wenn die Ausnahmeverarbeitung enthalten ist. Ich denke, es ist schwer, sich nur diese Worte vorzustellen, also werde ich es tatsächlich beschreiben.
Der folgende Code hat keine Ausnahmebehandlung.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
class Main{
public static void main(String args[]){
BufferedReader bufferReader = null;
FileReader fileReaderr = null;
//Eingabedatei
fileReaderr = new FileReader("test.txt");
bufferReader = new BufferedReader(fileReaderr);
//Zeile für Zeile lesen und ausgeben
String line;
while ((line = bufferReader.readLine()) != null) {
System.out.println(line);
//Schließen Sie den Stream absichtlich und lösen Sie eine IOException aus
bufferReader.close();
}
}
}
Wenn ich versuche, dies zu kompilieren
test.java:11:Error:Die Ausnahme FileNotFoundException wird nicht gemeldet. Muss gefangen genommen oder zum Werfen erklärt werden
fileReaderr = new FileReader("test.txt");
^
test.java:16:Error:Ausnahme IOException wird nicht gemeldet. Muss gefangen genommen oder zum Werfen erklärt werden
while ((line = bufferReader.readLine()) != null) {
^
test.java:21:Error:Ausnahme IOException wird nicht gemeldet. Muss gefangen genommen oder zum Werfen erklärt werden
bufferReader.close();
^
Es mag etwas schwer zu erkennen sein, aber die obige Beschreibung ist eine Nuance, die besagt, dass dieses Verhalten ohne Ausnahmebehandlung nicht funktioniert.
IOException erlaubt keine Kompilierung ohne Ausnahmebehandlung. IOException ist also das Ziel überprüfter Ausnahmen.
Lassen Sie uns also den Teil, in dem diese Operationen ausgeführt werden, mit try ~ catch einschließen.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
class Main{
public static void main(String args[]){
BufferedReader bufferReader = null;
FileReader fileReaderr = null;
try {
//Eingabedatei
fileReaderr = new FileReader("test.txt");
bufferReader = new BufferedReader(fileReaderr);
//Zeile für Zeile lesen und ausgeben
String line;
while ((line = bufferReader.readLine()) != null) {
System.out.println(line);
//Schließen Sie den Stream absichtlich und lösen Sie eine IOException aus
bufferReader.close();
}
} catch (IOException e) {
System.out.println("IOException tritt auf");
}
}
}
Wenn Sie dies kompilieren und ausführen
IOException tritt auf
Wenn Sie die txt-Datei im Prozess lesen und zwangsweise beenden, wird beim Versuch eine IOException ausgelöst. Zu diesem Zeitpunkt funktioniert die Ausnahmebehandlung und die Ausgabeoperation in catch wird ausgeführt.
Sie können Kompilierungsfehler auch beseitigen, indem Sie Würfe in der Methode definieren.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
class Main{
public static void main(String args[]) throws IOException{
BufferedReader bufferReader = null;
FileReader fileReaderr = null;
//Eingabedatei
fileReaderr = new FileReader("test.txt");
bufferReader = new BufferedReader(fileReaderr);
//Zeile für Zeile lesen und ausgeben
String line;
while ((line = bufferReader.readLine()) != null) {
System.out.println(line);
//Schließen Sie den Stream absichtlich und lösen Sie eine IOException aus
bufferReader.close();
}
}
}
Sie können auch mit dieser Beschreibung kompilieren. Auch mit dieser Beschreibung können Sie die Prüfausnahmen befolgen. Lauf einfach
Exception in thread "main" java.io.FileNotFoundException: test.txt (No such file or directory)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:212)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:154)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:109)
at java.base/java.io.FileReader.<init>(FileReader.java:60)
at Main.main(test.java:11)
Während der Ausführung tritt eine Ausnahme auf und die Verarbeitung wird beendet. Der Unterschied zu try ~ catch besteht darin, dass es keine Folgen (catch) gibt, wenn eine Ausnahme auftritt.
Für den Verarbeitungsablauf wurde zuerst IOException für try ~ catch ausgegeben, und zu diesem Zeitpunkt wurde der Prozess der catch-Anweisung übersprungen, sodass keine weitere Ausnahme auftrat.
Da Throws nur in dem Zustand sind, in dem IOException zu diesem Zeitpunkt zulässig ist, bedeutet dies, dass danach eine weitere Ausnahme auftritt und das Programm beendet wird. Würfe werden in einem anderen Artikel ausführlich beschrieben. Schauen Sie also auch dort nach.
Ich habe übrigens gehört, dass Java das einzige ist, das das Konzept überprüfter Ausnahmen hat. Wenn Sie also aus einer anderen Sprache stammen, werden Sie möglicherweise durch den Fehler verwirrt, der auftritt, obwohl der Vorgang korrekt ist.
Dies ist eine in anderen Sprachen übliche Form und eine willkürliche Ausnahme, die die Ausnahmebehandlung beschreibt. Dieses Mal werde ich mit ArrayIndexOutOfBoundsException prüfen (auf Elemente zugreifen, die nicht im Array vorhanden sind).
Dies ist eine Beschreibung ohne Ausnahmeverarbeitung.
class Main{
public static void main(String args[]){
int[] array = {0,1,2};
System.out.println(array[3]);
}
}
Ich versuche, auf das dritte Array-Array in der Ausgabe zu verweisen, aber es gibt nur 0 bis 2 Arrays. Aber es verursacht keinen Kompilierungsfehler, und wenn ich es ausführe
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at Main.main(test.java:6)
Ich habe eine ArrayIndexOutOfBoundsException. Mir wurde gesagt, ich versuche, außerhalb des Bereichs des Arrays zu schauen.
Lassen Sie uns nun die Ausnahmebehandlung einführen und es funktionieren lassen. Dies ist der Code, der im Mechanismus zur Behandlung von Überschriftenausnahmen beschrieben ist.
Kompiliert durch, genau wie beim Laufen
Ich habe eine Ausnahme
Ich konnte die Nachricht in der catch-Anweisung anzeigen.
Ungeprüfte Ausnahmen sind grundsätzlich vermeidbare Fehler und müssen nicht erwähnt werden. Ich finde, dass es für alle Fälle eher nuanciert ist.
finally Ich werde auch den Fall vorstellen, endlich nach dem Fang zu setzen.
class Main{
public static void main(String args[]){
try{
int[] array = {0,1,2};
System.out.println(array[2]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Ich habe eine Ausnahme");
}finally{
System.out.println("Funktioniert mit beiden");
}
}
}
Dies ist ein Prozess, der keine Ausnahme gibt, aber wenn er kompiliert und ausgeführt wird
2
Funktioniert mit beiden
Die Verarbeitung in endlich funktioniert auch so. Dieses Mal werde ich es mit der Beschreibung versuchen, die eine Ausnahme macht.
class Main{
public static void main(String args[]){
try{
int[] array = {0,1,2};
System.out.println(array[3]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Ich habe eine Ausnahme");
}finally{
System.out.println("Funktioniert mit beiden");
}
}
}
Wenn Sie kompilieren und ausführen
Ich habe eine Ausnahme
Funktioniert mit beiden
Das Display sieht so aus. Auf diese Weise wird es unabhängig vom Vorhandensein oder Fehlen von Ausnahmen beim Versuch angezeigt. In beiden Fällen wird hier der Vorgang beschrieben, den Sie verschieben und ausführen möchten.
throw Bis jetzt haben wir die Ausnahmeverarbeitung im Ablauf der Ausführung dieser Operation verfolgt, wenn eine Ausnahme auftritt. Sie können die Ausnahmeverarbeitung jedoch selbst (in Bezug auf Begriffe, eine Ausnahme auslösen) mit der throw-Anweisung ausführen.
Beschreiben wir zunächst den Wurf.
class Main{
public static void main(String args[]){
System.out.println("Ausnahmewurf");
try{
throw new Exception("Eine Ausnahme auslösen");
}catch(Exception e){
System.out.println("Ausnahmebehandlung");
}
}
}
Wenn du rennst
Ausnahmewurf
Ausnahmebehandlung
Dieser Prozess wird versucht
throw new IOException("Eine Ausnahme auslösen");
Funktioniert. Mit dieser Beschreibung wird eine Ausnahme ausgegeben, die durch die catch-Anweisung ergänzt wird, was zu zwei Ausgaben führt.
throws throw ist eine Spezifikation, die der Methodenaufrufer ausführt, wenn eine Ausnahme auftritt. Ich denke, es ist schwer, sich nur diese Worte vorzustellen, deshalb werde ich sie auch hier beschreiben.
class Main{
public static void main(String args[]){
System.out.println("Ausnahmewurf");
try{
Main.mikan();
}catch(Exception e){
System.out.println("Ausnahmebehandlung");
}
}
static void mikan() throws Exception{
throw new Exception("Eine Ausnahme auslösen");
}
}
Wenn Sie es kompilieren und ausführen
Ausnahmewurf
Ausnahmebehandlung
Es wird angezeigt. Als Ablauf der Operation wird die Mikan-Methode in der try-Anweisung der Hauptmethode aufgerufen.
Eine Wurfausnahme wird in der aufgerufenen Mikan-Methode definiert. Einfach ausgedrückt bedeutet dies, dass eine Ausnahme, die innerhalb einer Methode ausgegeben wird, an den Aufrufer übergeben wird.
Da wir in der Methode eine Ausnahme ausgeben, werden wir die Ausnahme an den Aufrufer senden. Catch ergänzt es und die Ausgabe der Ausnahmebehandlung wird verschoben.
In diesem Beispiel wird die Ausnahmeverarbeitung zur Vereinfachung des Bildes durch catch ergänzt. Wenn Sie sie jedoch tatsächlich schreiben, ist es besser, die Ausnahme zu beschreiben, die bei dieser Methode auftreten kann. Überlegen. Daher wird das Beispiel von hier so beschrieben, dass es eine IOException empfängt (Ausnahme prüfen).
Bei Würfen sollte beachtet werden, dass, wenn die Methode zum Auslösen einer aktivierten Ausnahme definiert ist, ein Fehler auftritt, wenn der Aufrufer try ~ catch nicht einschließt, und wenn nicht throw definiert ist, try ~ catch Es ist ein Fehler, auch wenn der Anrufer von umgeben ist. Dies wird auch tatsächlich beschrieben.
Hier ist der Methodenaufrufer in try ~ catch eingeschlossen, aber die Methodenseite definiert keine Würfe.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
class Main{
public static void main(String args[]){
try{
Main.mikan();
}catch(IOException e){
System.out.println("Ich erhalte eine IOException");
}
}
static void mikan(){
BufferedReader bufferReader = null;
FileReader fileReaderr = null;
//Eingabedatei
fileReaderr = new FileReader("test.txt");
bufferReader = new BufferedReader(fileReaderr);
//Zeile für Zeile lesen und ausgeben
String line;
while ((line = bufferReader.readLine()) != null) {
System.out.println(line);
//Schließen Sie den Stream absichtlich und lösen Sie eine IOException aus
bufferReader.close();
}
}
}
Wenn ich versuche, dies zu kompilieren
test.java:9:Error:Ausnahme IOException wird nicht im Hauptteil der entsprechenden try-Anweisung ausgelöst
}catch(IOException e){
^
test.java:18:Error:Die Ausnahme FileNotFoundException wird nicht gemeldet. Muss gefangen genommen oder zum Werfen erklärt werden
fileReaderr = new FileReader("test.txt");
^
test.java:23:Error:Ausnahme IOException wird nicht gemeldet. Muss gefangen genommen oder zum Werfen erklärt werden
while ((line = bufferReader.readLine()) != null) {
^
test.java:27:Error:Ausnahme IOException wird nicht gemeldet. Muss gefangen genommen oder zum Werfen erklärt werden
bufferReader.close();
^
4 Fehler
Ein Fehler wird angezeigt. Die unteren drei Fehler ähneln den Fehlern, wenn sie nicht in try ~ catch enthalten sind, und sind Fehler für den Zustand, in dem die Entsprechung von IOException anscheinend nicht beschrieben wird, obwohl es sich um eine geprüfte Ausnahme handelt.
Der obige Fehler ist ein Fehler, der besagt, dass IOException in try ~ catch nicht auftritt. Es passiert tatsächlich in der Methode, aber da es nicht deklariert ist, kann die Versuchsseite es nicht bestätigen.
Als nächstes gibt es keine Beschreibung von try ~ catch im Methodenaufrufer. Lassen Sie uns also die Operation mit der Person überprüfen, die Würfe in der Methode definiert.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
class Main{
public static void main(String args[]){
Main.mikan();
}
static void mikan() throws IOException{
BufferedReader bufferReader = null;
FileReader fileReaderr = null;
//Eingabedatei
fileReaderr = new FileReader("test.txt");
bufferReader = new BufferedReader(fileReaderr);
//Zeile für Zeile lesen und ausgeben
String line;
while ((line = bufferReader.readLine()) != null) {
System.out.println(line);
//Schließen Sie den Stream absichtlich und lösen Sie eine IOException aus
bufferReader.close();
}
}
}
Dieser Code ist eine Kopie des Prozesses, der in try in der Beispielprüfungsausnahme zur mikan-Methode enthalten sein muss. Wenn ich versuche, dies zu kompilieren
Ausnahme IOException wird nicht gemeldet. Muss gefangen genommen oder zum Werfen erklärt werden
Main.mikan();
^
Ich bekomme eine Fehlermeldung. Dies ist das Gegenteil der vorherigen, und aus der Throws-Definition ist bekannt, dass auf der Aufruferseite eine IOException auftritt. Da es sich jedoch um eine aktivierte Ausnahme handelt, ist es ein Fehler, dass Sie sie in try ~ catch einschließen müssen.
Fügen Sie das obige Beispiel einer try-Anweisung bei.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
class Main{
public static void main(String args[]){
try{
Main.mikan();
}catch(IOException e){
System.out.println("Ich erhalte eine IOException");
}
}
static void mikan() throws IOException{
BufferedReader bufferReader = null;
FileReader fileReaderr = null;
//Eingabedatei
fileReaderr = new FileReader("test.txt");
bufferReader = new BufferedReader(fileReaderr);
//Zeile für Zeile lesen und ausgeben
String line;
while ((line = bufferReader.readLine()) != null) {
System.out.println(line);
//Schließen Sie den Stream absichtlich und lösen Sie eine IOException aus
bufferReader.close();
}
}
}
Jetzt, wenn Sie kompilieren und ausführen
Ich erhalte eine IOException
Es wird angezeigt. Bei der mikan-Methode ist eine Ausnahme aufgetreten, und der Aufrufer konnte die Ausgabe in der catch-Anweisung abfangen und verarbeiten. Wenn in Würfen geprüfte Ausnahmen definiert sind, beachten Sie die Beschreibung des Anrufers.
Ich habe verschiedene Ausnahmen beschrieben. Wie oben erwähnt, sollten Sie beim Studium von Java die aktivierten Ausnahmen überprüfen, um den Fehler zu beheben.
Recommended Posts