文件扫描器:未报告的异常 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_fileScanner 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 异常

Tomcat启动报FileNotFound异常解决方案

使用 pyspark 在数据块中实现 FileNotFound 异常

TestFlight 崩溃报告

java.io 上的 FileNotFound(访问被拒绝)异常

vs2013 winforms 项目在其他计算机上不起作用,给出 filenotfound 异常