文件扫描程序:未报告的异常FileNotFoundException;必须被抓住或宣布被抛出

时间:2019-02-20 23:32:22

标签: java java.util.scanner

我已经尽我所能在互联网上找到的所有内容,但似乎没有任何解决方法。我恳求帮助,告诉我我做错了什么。我是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

5 个答案:

答案 0 :(得分:2)

我建议使用main块将整个read函数包围起来,如下所示。

try/catch

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/catchScanner file_reader = new Scanner(credentials_file);可能会引发错误。因此,您需要在credentials_file块周围进行覆盖,这将为您提供一个异常,可以对其进行处理以在try块中显示正确的响应消息。

希望有帮助!

答案 1 :(得分: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 JavaHow to Specify and Handle Exceptions in Java的更多信息。

有一个论点,您应该让异常冒泡给调用者。 This answer描述了如何做到这一点。但是在这种情况下,调用者实际上并不知道如何处理FileNotFoundException,因为它对文件一无所知。该文件在此方法中定义。

您可以抛出一个不同的,更具解释性的异常。或者,您可以在这里通过解释credentials.txt是什么来处理异常。或故障转移到默认值。或者只是记录异常,尽管这是有问题的。如果这样做,则应解释(在评论中)为什么足够。

我添加了一行以递增index_counter,只是因为它似乎丢失了。

另请参见

答案 2 :(得分:1)

Java已检查异常。这意味着,如果您方法中的代码声明它可能会抛出特定异常,则您的方法要么需要执行以下操作之一:

任何(1)处理该异常:

if statements

或(2)声明它可能会抛出该异常:

public static void read() {
    try {
        // your method code
    } catch (FileNotFoundException ex) {
        // handle the exception
    }
}

答案 3 :(得分:1)

只需将其添加到您的方法声明中即可:

public static void read() throws FileNotFoundException

有关处理Java中检查的异常的方法,请检查this(Oracle Docs Java Tutorials)

  

通过提供一个或一个,将异常处理程序与try块相关联   在try块之后直接有更多catch块。两者之间不能有代码   try块的结尾和第一个catch块的开始。

     

尝试{

     

} catch(ExceptionType名称){

     

} catch(ExceptionType名称){

     

}

还有this

  

有时候   适用于代码捕获其中可能发生的异常。在   但是,在其他情况下,最好让方法进一步调用   堆栈处理异常

     

公共无效writeList()引发IOException {

P.S。另外,它已经是discussed on stackoverflow,因此也许应该标记为重复。

答案 4 :(得分:0)

您应该阅读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());
    }
}