解决 Java 中 Unreported Exception IOException Must Be Caught or Declared to Be Thrown
本篇文章介绍了另一个编译时异常,即未报告的异常 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!");
这就是我们处理声明的异常的原因。 请记住,我们只能声明已检查的异常,因为程序员可以在代码中处理未检查的异常。
相关文章
如何在 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 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,