迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

解决 Java 中 Unreported Exception IOException Must Be Caught or Declared to Be Thrown

作者:迹忆客 最近更新:2023/07/12 浏览次数:

本篇文章介绍了另一个编译时异常,即未报告的异常 ioException; 必须被抓住或宣布被扔出。 我们还将通过示例程序了解其可能的原因和解决方案。


未报告的 IOException 演示

示例代码:

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

在上面的代码中,我们从指定的输入文件中读取数据; 查找字母 x。 一旦找到,我们就将同一行中的 x 和即将出现的文本替换为用双引号 (" ") 括起来的单词 Updated。

最后,我们关闭两个文件(输入和输出)。

inputFile.close() 行; 我们在上面的代码示例中指出的是导致未报告的 IOException ,必须捕获或抛出该异常。 这是什么意思?

这意味着 inputFile.close(); 导致了 IOException,我们可以使用 try-catch 块(称为捕获异常)或使用 throws 关键字(称为抛出异常)来消除该异常。 怎么做?

我们通过下面的代码示例来学习一下。


使用 try-catch 捕获未报告的 IOException

示例代码:

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

输入文件具有以下内容。

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

执行程序后,我们得到一个包含以下内容的输出文件。

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

在这里,我们使用 try-catch 块消除 IOException,其中 try 语句让我们定义在执行过程中需要检查错误的特定代码块。

如果try块中的任何特定语句发生任何异常,它将停止执行并跳转到catch块。 因此,强烈建议不要将不会引发任何异常的代码保留在 try 块中。

另一方面,catch 语句允许定义一个代码块,如果 try 块中出现任何错误,则需要执行该代码块。 catch 写在 try 块之后。

我们还可以根据在各自的 try 块中获得的异常数量来拥有多个 catch 块。

我们还可以在处理异常时编写自定义消息。 现在的问题是如何处理这些异常。

Java 虚拟机 (JVM) 检查是否处理异常。 如果不是,JVM 将使用默认的异常处理程序,该处理程序执行下面列出的一些任务:

  • 它在程序的输出控制台中打印异常的描述。
  • 它还在程序的输出控制台中打印堆栈跟踪。 堆栈跟踪是发生异常的方法的层次结构。
  • 它导致程序终止。

另一方面,如果应用程序程序员处理了异常,则应用程序的正常流程将得以维持,这意味着剩余的代码将被执行。


使用 throws 关键字消除 IOException

示例代码:

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

输入文件的内容如下。

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

输出文件具有更新的内容,如下所示。

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

这段代码与上一节相同,我们只使用 try-catch 块来处理异常。 在这里,我们使用 throws 来声明异常; 我们还可以声明多个异常,并用逗号(,)分隔。

throws 关键字通知应用程序程序员此方法中可能会发生异常。 请记住, throws 关键字是在定义函数时编写的(请参见给定的示例代码)。

因此,强烈建议程序员在代码中处理此异常以维持正常的执行流程。 否则,程序将终止。 让我们通过示例代码来理解它。

复制以下代码并运行它。 确保输入文件的路径不正确。

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

输出:

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

我们将看到上面给出的输出。 程序继续执行代码,因为我们已经处理了异常。

现在,注释掉 try、catch 和 finally 块,如下所示,然后重新运行代码。 确保输入文件的路径不正确。

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

程序一发现异常就会终止执行,永远不会到达下面这行代码。

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

这就是我们处理声明的异常的原因。 请记住,我们只能声明已检查的异常,因为程序员可以在代码中处理未检查的异常。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

修复 Java 中错误 Error: Else Without if

发布时间:2023/07/13 浏览次数:183 分类:Java

本篇文章我们将了解在用 Java 编写代码时只说 'else' without 'if' 的错误。 我们还将找出导致此错误的可能原因并找到解决方案。Java 中 error: 'else' without 'if'

Java 中的无效字符常量

发布时间:2023/07/13 浏览次数:152 分类:Java

本 Java 文章将讨论无效字符常量。 但在此之前,我们需要了解字符常量。Java字符常量 单字符常量,也称为字符常量,是封装在一对 '' 或单引号中的单个字符。

解决 Java 中 Missing Method Body or Declare Abstract

发布时间:2023/07/13 浏览次数:68 分类:Java

本篇文章讨论编译时错误、missing method body, or declare abstract。 在这里,我们将经历三个不同的步骤。首先,我们将了解一个Java程序来了解错误。 其次,突出显示此错误的可能原因,并最终找到

在 Java 中使用 Scanner 时没有此类元素异常

发布时间:2023/07/13 浏览次数:72 分类:Java

本篇文章将介绍如何在 Java 中使用 Scanner 时解决 NoSuchElementException 错误。在 Java 中使用 Scanner 时没有此类元素异常 Scanner 类用于在 Java 程序中获取用户输入。 它使用多种实用方法,如 next()、

Java 错误 Java.Net.SocketTimeoutException: Connection Timed Out

发布时间:2023/07/13 浏览次数:161 分类:Java

在本篇文章中,我们将讨论 java.net.SocketTimeoutException: Connection timed out。 但首先,让我们仔细看看套接字和超时的概念。Java 中的套接字 两个计算机应用程序之间的逻辑链接可能有多个端点,其

Java 错误 Char Cannot Be Dereferenced

发布时间:2023/07/13 浏览次数:87 分类:Java

本篇文章介绍如何解决Java的 java char cannot be dereferenced 错误。Java Char cannot be dereferenced 当我们尝试使用 equals() 方法检查一个字符是否与另一个字符相等时,会出现错误 java char can not be dereferenc

JavaFX 中 InvocationTargetException

发布时间:2023/07/13 浏览次数:165 分类:Java

本篇文章介绍如何解决 JavaFX 中的 InvocableTargetException。修复 JavaFX 中的 InspirationTargetException 当我们使用 JavaFX 时,会发生 InvokingTargetException 异常。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便