Resuelva la excepción no informada IOException debe ser capturada o declarada para ser lanzada en Java

Mehvish Ashiq 12 octubre 2023
  1. Demostración de IOException no reportada
  2. Use try-catch para atrapar IOException no reportadas
  3. Use la palabra clave throws para erradicar IOException
Resuelva la excepción no informada IOException debe ser capturada o declarada para ser lanzada en Java

Este tutorial muestra otra excepción de tiempo de compilación que dice excepción no reportada ioexception; debe ser cogida o declarada para ser arrojada. También aprenderemos sobre sus posibles causas y soluciones a través de programas de muestra.

Demostración de IOException no reportada

Código de ejemplo:

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();
      }
    }
  }
}

En el código anterior, leemos datos del archivo de entrada especificado; busca la letra x. Tan pronto como se encuentra, reemplazamos la x y el texto siguiente en la misma línea con la palabra Actualizado entre comillas dobles (" ").

Finalmente, cerramos ambos archivos (entrada y salida).

La línea inputFile.close(); que estamos señalando en el ejemplo de código anterior está causando una IOException no reportada que debe ser capturada o lanzada. ¿Qué quiere decir esto?

Significa el inputFile.close(); está causando la IOException de la que podemos deshacernos usando el bloque try-catch (se llama capturar la excepción) o usando la palabra clave throws (se llama excepción lanzada). ¿Cómo hacerlo?

Aprendamos con ejemplos de código a continuación.

Use try-catch para atrapar IOException no reportadas

Código de ejemplo:

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();
      }
    }
  }
}

El archivo de entrada tiene el siguiente contenido.

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

Después de ejecutar el programa, obtenemos un archivo de salida que contiene el contenido a continuación.

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

Aquí, eliminamos la IOException utilizando el bloque try-catch, donde la instrucción try nos permite definir un bloque de código específico que debe examinarse en busca de errores durante el proceso de ejecución.

Si ocurre alguna excepción en cualquier declaración particular dentro del bloque try, detendrá la ejecución y saltará al bloque catch. Por lo tanto, se recomienda encarecidamente no mantener el código dentro del bloque intentar que no arroja ninguna excepción.

Por otro lado, la declaración catch permite definir un bloque de código que debe ejecutarse si hay algún error en el bloque try. El capturar se escribe justo después del bloque intentar.

También podemos tener varios bloques de catch según la cantidad de excepciones que podamos obtener en el bloque try respectivo.

También podemos escribir un mensaje personalizado mientras manejamos la excepción. Ahora, la pregunta es cómo se manejan estas excepciones.

La máquina virtual de Java (JVM) verifica si se maneja una excepción o no. Si no es así, la JVM funciona con el controlador de excepciones predeterminado, que realiza algunas tareas que se enumeran a continuación:

  • Imprime la descripción de una excepción en la consola de salida del programa.
  • También imprime el stack trace en la consola de salida del programa. El seguimiento de la pila es la jerarquía de métodos donde ocurrió una excepción.
  • Da lugar a la terminación del programa.

Por otro lado, el flujo normal de la aplicación se mantiene si un programador de aplicaciones ha manejado la excepción, lo que significa que se ejecuta el código restante.

Use la palabra clave throws para erradicar IOException

Código de ejemplo:

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();
      }
    }
  }
}

El contenido de un archivo de entrada es el siguiente.

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

El archivo de salida tiene el contenido actualizado como se indica a continuación.

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

Este código es el mismo que la sección anterior, donde solo usamos el bloque try-catch para manejar la excepción. Aquí, estamos usando lanzamientos para declarar una excepción; también podemos declarar múltiples excepciones separadas por una coma (,).

La palabra clave throws informa al programador de la aplicación que puede ocurrir una excepción en este método. Recuerde, la palabra clave throws se escribe al definir la función (ver en el código de ejemplo dado).

Por lo tanto, es bueno y muy recomendable que el programador maneje esta excepción en el código para mantener el flujo de ejecución normal. De lo contrario, el programa terminará. Entendámoslo a través del código de ejemplo.

Copie el siguiente código y ejecútelo. Asegúrese de que tengamos una ruta incorrecta para el archivo de entrada.

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

Producción :

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

Veremos la salida como se indica arriba. El programa continúa con la ejecución del código porque hemos manejado la excepción.

Ahora, comente los bloques try, catch y finally de la siguiente manera y vuelva a ejecutar el código. Asegúrese de que tengamos una ruta incorrecta para un archivo de entrada.

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

El programa terminará la ejecución tan pronto como encuentre la excepción y nunca llegue a la siguiente línea de código.

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

Esta es la razón por la que manejamos nuestras excepciones declaradas. Recuerde, solo podemos declarar las excepciones marcadas porque el programador puede manejar las excepciones no marcadas dentro del código.

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

Artículo relacionado - Java Error