如何使用try / catch来避免在java中抛出FileNotFoundException

时间:2015-10-31 17:32:18

标签: java try-catch filenotfoundexception throws

我正在尝试从我的方法输出文件扫描程序对象。这是一项学校作业,我被特别指示不抛出任何异常,但改为使用try / catch。分配要求命令行提示用户扫描文件。如果文件不存在,我们应该告诉用户,然后再次提示他们输入文件。如果文件存在,则该方法返回扫描文件的扫描程序对象。

我的代码有效,但不干净。它涉及2种方法。到目前为止,这是我的代码:

public static Scanner getInputScanner (Scanner console) {
    File inputFile = null;
    Scanner input = null;
    try {
        inputFile = getFile(inputFile, console);
        input = new Scanner (inputFile);
        return input;
    } catch (FileNotFoundException e) {
        try {
            return input = new Scanner (getFile (inputFile, console));
        } catch (FileNotFoundException f) {
            System.out.println("An error has occured.");
            return input;
        }
    }

}

public static File getFile (File inputFile, Scanner console) {

    System.out.println("Enter input file: ");
    inputFile = new File (console.nextLine());

    while (!inputFile.exists()) {
        System.out.println("File does not exist.");
        System.out.print("Enter input file: ");
        inputFile = new File (console.nextLine());
    }
    return inputFile;
}

代码的问题是输出如下所示:

输入输入文件:

文件不存在。

输入输入文件:

然后它正在等待用户的输入。我不希望输出在最后一行之前有2行代码。

有人可以解释为什么我的代码输出这2行吗? 另外,有没有更简单的解决方案来获取输入文件而不抛出FileNotFoundException?

谢谢!

3 个答案:

答案 0 :(得分:0)

如果我理解正确, 你的程序在运行时输出这些行, 无论, 没有你真正输入文件名的机会。

Enter input file:
File does not exist.

然后程序再次问你:

Enter input file:

你不希望前两行,对吗? 例如,如果您收到的Scanner console中有未读的换行符,就会发生这种情况。 你还没有发布那部分代码, 所以很难说,但这是Scanner的常见问题。 在致电getInputScanner之前, 确保Scanner console可以使用, 没有未读垃圾仍在其中缓冲。

至于你问题的第二部分, 是的,这可以写得更简单,更好,例如:

public static Scanner getInputScanner(Scanner console) {
    try {
        File inputFile = getExistingFile(console);
        return new Scanner(inputFile);
    } catch (FileNotFoundException e) {
        throw new AssertionError("The file is expected to exist (was supposed to be verified earlier)");
    }
}

public static File getExistingFile(Scanner console) {
    while (true) {
        System.out.println("Enter input file: ");
        File inputFile = new File(console.nextLine());

        if (inputFile.exists()) {
            return inputFile;
        }
        System.out.println("File does not exist.");
    }
}

答案 1 :(得分:0)

一旦调用了getFile(),就会执行下面的行。

System.out.print(“输入输入文件:”);

由于不存在任何文件,以下行继续执行:

while(!inputFile.exists()){

    System.out.println ("File does not exist.");
    System.out.print("Enter input file: ");

您可以使用throws()而不是try / catch,然后调用者将处理异常。

答案 2 :(得分:0)

在获得用户输入之前,必须通过插入Scanner.nextLine()来消耗扫描仪带来的垃圾。最终代码如下所示:

public static Scanner getInputScanner(Scanner console) {
    try {
        File inputFile = getExistingFile(console);
        return new Scanner(inputFile);
    } catch (FileNotFoundException e) {
        throw new AssertionError("The file is expected to exist (was supposed to be verified earlier)");
    }
}

public static File getExistingFile(Scanner console) {
    while (true) {
        console.nextLine();
        System.out.println("Enter input file: ");
        File inputFile = new File(console.nextLine());

        if (inputFile.exists()) {
            return inputFile;
        }
        System.out.println("File does not exist.");
    }
}