文件扫描器:未报告的异常 FileNotFoundException;必须被抓住或宣布被抛出
Posted
技术标签:
【中文标题】文件扫描器:未报告的异常 FileNotFoundException;必须被抓住或宣布被抛出【英文标题】:File Scanner: Unreported exception FileNotFoundException; must be caught or declared to be thrown 【发布时间】:2019-02-20 23:32:21 【问题描述】:我已经尝试了所有可以在 Internet 上找到的方法,但似乎没有任何方法可以解决此问题。我正在寻求帮助,告诉我我做错了什么。我是 Java 的新手。谢谢!
import java.util.Scanner;
class File_Scanner
public static void read()
File credentials_file = new File("credentials.txt");
Scanner file_reader = new Scanner(credentials_file);
String[] users = new String[6];
int index_counter = 0;
try
while (file_reader.hasNextLine())
users[index_counter] = file_reader.nextLine();
file_reader.close();
catch (Exception e)
System.out.println(e.getClass());
这是显示以下错误
Unreported exception FileNotFoundException; must be caught or declared to be thrown
【问题讨论】:
编译器错误的行号应该准确地告诉您哪一行会引发该异常。 阅读“检查异常”。编写更好的代码,但有时会很痛苦。 【参考方案1】:我想建议用try/catch
块包围整个read
函数,如下所示。
import java.util.Scanner;
class File_Scanner
public static void read()
try
File credentials_file = new File("credentials.txt");
Scanner file_reader = new Scanner(credentials_file);
String[] users = new String[6];
int index_counter = 0;
while (file_reader.hasNextLine())
users[index_counter] = file_reader.nextLine();
file_reader.close();
catch (Exception e)
System.out.println(e.getClass());
try/catch
的想法是避免在运行程序时可能发生的任何错误。在您的情况下,如果未找到或删除 credentials_file
,Scanner file_reader = new Scanner(credentials_file);
可能会引发错误。因此,您需要在 try
块周围覆盖它,这会给您一个异常,可以处理该异常以在 catch
块中显示正确的响应消息。
希望对您有所帮助!
【讨论】:
【参考方案2】:我同意关于该问题的其他答案(如果找不到文件,Scanner
会抛出异常)。我还没有看到我认为正确的解决方案。
String[] users = new String[6];
int index_counter = 0;
File credentials_file = new File("credentials.txt");
try (Scanner file_reader = new Scanner(credentials_file))
while (file_reader.hasNextLine())
users[index_counter] = file_reader.nextLine();
index_counter++;
catch (FileNotFoundException e)
// handle exception
catch (NoSuchElementException e)
// handle exception
catch (IllegalStateException e)
// handle exception
try-with-resources 语句会自动为您关闭Scanner
。这适用于任何实现AutoCloseable
接口的类。
在这种情况下,它将语句置于try
的范围内,因此将捕获异常。
你的异常处理是有问题的,所以我没有包括它。但这不是重点。您可以阅读有关Best Practices to Handle Exceptions in Java 或How to Specify and Handle Exceptions in Java 的更多信息。
有一个论点是你应该让异常冒泡给调用者。 This answer 描述了如何做到这一点。但在这种情况下,调用者并不真正知道如何处理FileNotFoundException
,因为它对文件一无所知。该文件在此方法中定义。
您可以抛出一个不同的、更具解释性的异常。或者您可以通过解释 credentials.txt
是什么来处理此处的异常。或者故障转移到默认设置。或者只是记录异常,尽管这是有问题的。如果你这样做了,你应该(在评论中)解释为什么这样就足够了。
我添加了一行来增加 index_counter
只是因为它似乎丢失了。
另见
Why do I get "Exception; must be caught or declared to be thrown" when I try to compile my Java code? Am I using the Java 7 try-with-resources correctly?【讨论】:
【参考方案3】:Java 已检查异常。这意味着如果您的方法中的代码声明它可能会引发特定异常,则您的方法需要执行以下操作之一:
任一 (1) 处理该异常:
public static void read()
try
// your method code
catch (FileNotFoundException ex)
// handle the exception
或者 (2) 声明它可能会抛出该异常:
public static void read() throws FileNotFoundException
// your method code
【讨论】:
【参考方案4】:只需将其添加到您的方法声明中:
public static void read() throws FileNotFoundException
关于在java中处理已检查异常的方法检查this(Oracle Docs Java Tutorials):
您可以通过提供一个或 在 try 块之后直接有更多的 catch 块。之间不能有代码 try 块的结束和第一个 catch 块的开始。
试试
捕获(异常类型名称)
捕获(异常类型名称)
还有this:
有时候, 适合代码捕获其中可能发生的异常。在 但是,在其他情况下,最好让方法进一步调用 堆栈处理异常
public void writeList() 抛出 IOException
附:另外,它已经是discussed on ***,所以应该标记为重复。
【讨论】:
【参考方案5】:你应该阅读java检查异常
public static void read()
try
File credentials_file = new File("credentials.txt");
Scanner file_reader;
file_reader = new Scanner(credentials_file);
String[] users = new String[6];
int index_counter = 0;
while (file_reader.hasNextLine())
users[index_counter] = file_reader.nextLine();
file_reader.close();
catch (FileNotFoundException e1)
// TODO Auto-generated catch block
e1.printStackTrace();
catch (Exception e)
System.out.println(e.getClass());
【讨论】:
以上是关于文件扫描器:未报告的异常 FileNotFoundException;必须被抓住或宣布被抛出的主要内容,如果未能解决你的问题,请参考以下文章
最简单的 AppDomain 和 FileNotFound 异常
使用 pyspark 在数据块中实现 FileNotFound 异常