迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > 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 中延迟几秒钟的时间

发布时间:2023/12/17 浏览次数:217 分类:Java

本篇文章主要介绍如何在 Java 中制造程序延迟。本教程介绍了如何在 Java 中制造程序延时,并列举了一些示例代码来了解它。

如何在 Java 中把 Hashmap 转换为 JSON 对象

发布时间:2023/12/17 浏览次数:187 分类:Java

它描述了允许我们将哈希图转换为简单的 JSON 对象的方法。本文介绍了在 Java 中把 Hashmap 转换为 JSON 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 JSON 对象的详细例子。

如何在 Java 中按值排序 Map

发布时间:2023/12/17 浏览次数:171 分类:Java

本文介绍了如何在 Java 中按值对 Map 进行排序。本教程介绍了如何在 Java 中按值对 Map 进行排序,并列出了一些示例代码来理解它。

如何在 Java 中打印 HashMap

发布时间:2023/12/17 浏览次数:192 分类:Java

本帖介绍了如何在 Java 中打印 HashMap。本教程介绍了如何在 Java 中打印 HashMap 元素,还列举了一些示例代码来理解这个主题。

在 Java 中更新 Hashmap 的值

发布时间:2023/12/17 浏览次数:146 分类:Java

本文介绍了如何在 Java 中更新 HashMap 中的一个值。本文介绍了如何在 Java 中使用 HashMap 类中包含的两个方法-put() 和 replace() 更新 HashMap 中的值。

Java 中的 hashmap 和 map 之间的区别

发布时间:2023/12/17 浏览次数:79 分类:Java

本文介绍了 Java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 Java 中 Map 和 HashMap 之间的主要区别。在 Java 中,Map 是用于以键值对存储数据的接口,

在 Java 中获取用户主目录

发布时间:2023/12/17 浏览次数:218 分类:Java

这篇文章向你展示了如何在 Java 中获取用户主目录。本教程介绍了如何在 Java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。

Java 中 size 和 length 的区别

发布时间:2023/12/17 浏览次数:179 分类:Java

这篇文章教你如何知道 Java 中大小和长度之间的区别。本教程介绍了 Java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。

Java 中的互斥锁

发布时间:2023/12/17 浏览次数:111 分类:Java

了解有关 Java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,

扫一扫阅读全部技术教程

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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便