解决 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 中错误 Error: Else Without if
发布时间:2023/07/13 浏览次数:183 分类:Java
-
本篇文章我们将了解在用 Java 编写代码时只说 'else' without 'if' 的错误。 我们还将找出导致此错误的可能原因并找到解决方案。Java 中 error: 'else' without 'if'
Java 中 The System Cannot Find the File Specified
发布时间:2023/07/13 浏览次数:99 分类:Java
-
本篇文章介绍如何解决 Java 中的 The system cannot find the file specified 错误。修复Java中 The system cannot find the file specified 错误
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 错误 Javac Is Not Recognized as an Internal or External Command, Operable
发布时间:2023/07/13 浏览次数:108 分类:Java
-
本文介绍了 Java 的 'javac' is not recognized as an internal or external command, operable program or batch file 的可能原因以及该错误的可能解决方案。 首先,我们来看看 javac 是什么。Java 中的 Javac
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 异常。