Nicht gemeldete Ausnahme auflösen IOException muss abgefangen oder deklariert werden, um in Java ausgelöst zu werden

Mehvish Ashiq 12 Oktober 2023
  1. Demonstration einer nicht gemeldeten IOException
  2. Verwenden Sie try-catch, um nicht gemeldete IOException abzufangen
  3. Verwenden Sie das Schlüsselwort throws, um IOException zu beseitigen
Nicht gemeldete Ausnahme auflösen IOException muss abgefangen oder deklariert werden, um in Java ausgelöst zu werden

Dieses Tutorial demonstriert eine weitere Kompilierzeit-Ausnahme mit der Aufschrift nicht gemeldete Ausnahme ioexception; muss gefangen oder für geworfen erklärt werden. Wir werden auch über mögliche Ursachen und Lösungen anhand von Beispielprogrammen informiert.

Demonstration einer nicht gemeldeten IOException

Beispielcode:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class TestClass {
  public static void main(String[] args) {
    BufferedReader inputFile = null;
    PrintWriter outputFile = null;
    String inputFileName = "C:\\New folder\\inputFile.txt";
    String outputFileName = "C:\\New folder\\outputFile.txt";
    try {
      inputFile = new BufferedReader(new FileReader(inputFileName));
      outputFile = new PrintWriter(new FileWriter(outputFileName));
      String lineOfText = inputFile.readLine();
      while (lineOfText != null) {
        if (lineOfText.contains("x")) {
          lineOfText = lineOfText.replaceAll("x"
                  + ".*",
              "\"Updated\"");
        }
        outputFile.println(lineOfText);
        lineOfText = inputFile.readLine();
      }
    } catch (IOException ioe) {
      System.err.println("Caught IOException: " + ioe.getMessage());
    } finally {
      if (inputFile != null) {
        inputFile.close(); //<------This line causes this exception
      }
      if (outputFile != null) {
        outputFile.close();
      }
    }
  }
}

Im obigen Code lesen wir Daten aus der angegebenen Eingabedatei; Suchen Sie nach dem Buchstaben x. Sobald es gefunden wird, ersetzen wir das x und den nachfolgenden Text in derselben Zeile durch das in doppelte Anführungszeichen (" ") eingeschlossene Wort Updated.

Abschließend schließen wir beide Dateien (Eingabe und Ausgabe).

Die Zeile inputFile.close(); auf die wir im obigen Codebeispiel verweisen, verursacht eine nicht gemeldete IOException, die abgefangen oder geworfen werden muss. Was bedeutet das?

Es bedeutet inputFile.close(); verursacht die IOException, die wir mit dem try-catch-Block (man nennt es Exception abfangen) oder mit dem Schlüsselwort throws (es heisst Exception is thrown) loswerden kann. Wie es geht?

Lassen Sie uns mit Codebeispielen unten lernen.

Verwenden Sie try-catch, um nicht gemeldete IOException abzufangen

Beispielcode:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class TestClass {
  public static void main(String[] args) {
    BufferedReader inputFile = null;
    PrintWriter outputFile = null;
    String inputFileName = "C:\\New folder\\inputFile.txt";
    String outputFileName = "C:\\New folder\\outputFile.txt";
    try {
      inputFile = new BufferedReader(new FileReader(inputFileName));
      outputFile = new PrintWriter(new FileWriter(outputFileName));
      String lineOfText = inputFile.readLine();
      while (lineOfText != null) {
        if (lineOfText.contains("x")) {
          lineOfText = lineOfText.replaceAll("x"
                  + ".*",
              "\"Updated\"");
        }
        outputFile.println(lineOfText);
        lineOfText = inputFile.readLine();
      }
    } catch (IOException ioe) {
      System.err.println("Caught IOException: " + ioe.getMessage());
    } finally {
      if (inputFile != null) {
        try {
          inputFile.close();
        } catch (IOException ioe) {
          System.err.println("Caught IOException: " + ioe.getMessage());
        }
      }
      if (outputFile != null) {
        outputFile.close();
      }
    }
  }
}

Die Eingabedatei hat folgenden Inhalt.

this is x one file
this is x two file
this is x three file

Nach dem Ausführen des Programms erhalten wir eine Ausgabedatei mit dem folgenden Inhalt.

this is "Updated"
this is "Updated"
this is "Updated"

Hier eliminieren wir die IOException mit dem try-catch-Block, wobei wir mit der try-Anweisung einen bestimmten Codeblock definieren können, der während des Ausführungsprozesses auf Fehler untersucht werden muss.

Wenn bei einer bestimmten Anweisung innerhalb des try-Blocks eine Ausnahme auftritt, wird die Ausführung angehalten und zum catch-Block gesprungen. Es wird daher dringend empfohlen, den Code nicht innerhalb des try-Blocks zu belassen, der keine Ausnahme auslöst.

Andererseits ermöglicht die catch-Anweisung die Definition eines Codeblocks, der ausgeführt werden muss, wenn ein Fehler im try-Block auftritt. Der catch wird direkt nach dem try-Block geschrieben.

Wir können auch mehrere catch-Blöcke haben, je nachdem, wie viele Ausnahmen wir im jeweiligen try-Block bekommen können.

Wir können auch eine benutzerdefinierte Nachricht schreiben, während wir die Ausnahme behandeln. Nun stellt sich die Frage, wie diese Ausnahmen gehandhabt werden.

Die Java Virtual Machine (JVM) prüft, ob eine Ausnahme behandelt wird oder nicht. Ist dies nicht der Fall, dient die JVM mit dem standardmäßigen Ausnahmehandler, der einige der unten aufgeführten Aufgaben ausführt:

  • Es gibt die Beschreibung einer Ausnahme in der Ausgabekonsole des Programms aus.
  • Es druckt auch den Stack-Trace in der Ausgabekonsole des Programms. Der Stack-Trace ist die Hierarchie der Methoden, in der eine Ausnahme aufgetreten ist.
  • Es führt zum Abbruch des Programms.

Andererseits wird der normale Ablauf der Anwendung aufrechterhalten, wenn ein Anwendungsprogrammierer die Ausnahme behandelt hat, was bedeutet, dass der verbleibende Code ausgeführt wird.

Verwenden Sie das Schlüsselwort throws, um IOException zu beseitigen

Beispielcode:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class TestClass {
  public static void main(String[] args) throws IOException {
    BufferedReader inputFile = null;
    PrintWriter outputFile = null;
    String inputFileName = "C:\\New folder\\inputFile.txt";
    String outputFileName = "C:\\New folder\\outputFile.txt";
    try {
      inputFile = new BufferedReader(new FileReader(inputFileName));
      outputFile = new PrintWriter(new FileWriter(outputFileName));
      String lineOfText = inputFile.readLine();
      while (lineOfText != null) {
        if (lineOfText.contains("x")) {
          lineOfText = lineOfText.replaceAll("x"
                  + ".*",
              "\"Updated\"");
        }
        outputFile.println(lineOfText);
        lineOfText = inputFile.readLine();
      }
    } catch (IOException ioe) {
      System.err.println("Caught IOException: " + ioe.getMessage());
    } finally {
      if (inputFile != null) {
        inputFile.close();
      }
      if (outputFile != null) {
        outputFile.close();
      }
    }
  }
}

Der Inhalt einer Eingabedatei ist wie folgt.

this is x one file
this is x two file
this is x three file

Die Ausgabedatei hat den unten angegebenen aktualisierten Inhalt.

this is "Updated"
this is "Updated"
this is "Updated"

Dieser Code ist derselbe wie im vorherigen Abschnitt, wo wir nur den try-catch-Block verwenden, um die Ausnahme zu behandeln. Hier verwenden wir throws, um eine Ausnahme zu deklarieren; wir können auch mehrere Ausnahmen deklarieren, die durch ein Komma (``) getrennt sind.

Das Schlüsselwort throws informiert den Anwendungsprogrammierer, dass bei dieser Methode eine Ausnahme auftreten kann. Denken Sie daran, dass das Schlüsselwort throws während der Definition der Funktion geschrieben wird (siehe im angegebenen Beispielcode).

Daher ist es gut und wird dringend empfohlen, dass der Programmierer diese Ausnahme im Code behandelt, um den normalen Ausführungsfluss aufrechtzuerhalten. Andernfalls wird das Programm beendet. Lassen Sie es uns anhand des Beispielcodes verstehen.

Kopieren Sie den folgenden Code und führen Sie ihn aus. Stellen Sie sicher, dass wir einen falschen Pfad für die Eingabedatei haben.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class TestClass {
  public static void main(String[] args) throws IOException {
    BufferedReader inputFile = null;
    PrintWriter outputFile = null;
    String inputFileName = "C:\\New folder\\input.txt";
    String outputFileName = "C:\\New folder\\outputFile.txt";
    try {
      inputFile = new BufferedReader(new FileReader(inputFileName));
      outputFile = new PrintWriter(new FileWriter(outputFileName));
      String lineOfText = inputFile.readLine();
      while (lineOfText != null) {
        if (lineOfText.contains("x")) {
          lineOfText = lineOfText.replaceAll("x"
                  + ".*",
              "\"Updated\"");
        }
        outputFile.println(lineOfText);
        lineOfText = inputFile.readLine();
      }
    } catch (IOException ioe) {
      System.err.println("Caught IOException: " + ioe.getMessage());
    } finally {
      if (inputFile != null) {
        inputFile.close();
      }
      if (outputFile != null) {
        outputFile.close();
      }
    }
    System.out.println("Continue execution!");
  }
}

AUSGANG:

Caught IOException: C:\New folder\input.txt (The system cannot find the file specified)
Continue execution!

Wir sehen die Ausgabe wie oben angegeben. Das Programm setzt die Codeausführung fort, da wir die Ausnahme behandelt haben.

Kommentieren Sie nun die Blöcke try, catch und finally wie folgt aus und führen Sie den Code erneut aus. Stellen Sie sicher, dass wir einen falschen Pfad für eine Eingabedatei haben.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class TestClass {
  public static void main(String[] args) throws IOException {
    BufferedReader inputFile = null;
    PrintWriter outputFile = null;
    String inputFileName = "C:\\New folder\\input.txt";
    String outputFileName = "C:\\New folder\\outputFile.txt";
    // try {
    inputFile = new BufferedReader(new FileReader(inputFileName));
    outputFile = new PrintWriter(new FileWriter(outputFileName));
    String lineOfText = inputFile.readLine();
    while (lineOfText != null) {
      if (lineOfText.contains("x")) {
        lineOfText = lineOfText.replaceAll("x"
                + ".*",
            "\"Updated\"");
      }
      outputFile.println(lineOfText);
      lineOfText = inputFile.readLine();
    }
    //} catch (IOException ioe) {
    //    System.err.println("Caught IOException: " + ioe.getMessage());
    //} finally {
    if (inputFile != null) {
      inputFile.close();
    }
    if (outputFile != null) {
      outputFile.close();
    }
    //}
    System.out.println("Continue execution!");
  }
}

Das Programm beendet die Ausführung, sobald es die Ausnahme findet, und erreicht nie die folgende Codezeile.

System.out.println("Continue execution!");

Aus diesem Grund behandeln wir unsere deklarierten Ausnahmen. Denken Sie daran, dass wir nur die checked-Ausnahmen deklarieren können, weil der Programmierer die ungeprüften Ausnahmen innerhalb des Codes behandeln kann.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

Verwandter Artikel - Java Error