为什么我的错误检查不起作用?

时间:2014-12-05 20:03:53

标签: java methods error-handling filenames

我做的是我做了一个错误检查,每当用户输入无效的文件名时就会循环:

    public static Scanner readFile(String filename){
    Scanner stdin = new Scanner(System.in);
    File input = new File(filename);
    Scanner sc = null;
    do {
        try {
            sc = new Scanner(input);
    }
        catch(FileNotFoundException e) {
            System.out.println("Filename not valid. Please try again:");
            filename = stdin.nextLine();
    }
} while (!new File(filename).exists()); 
            return sc;
    }

我也有足够的方法来读取该文件并将数据放入数组中:

public static CO2Data[] readData(String filename){
File input = new File(filename);
    Scanner sc = null;
    try{
        sc = new Scanner(input);
    }
    catch(FileNotFoundException e){
        System.out.println("Filename not valid");
        System.exit(-1);
    }
String info = sc.nextLine();
int total = sc.nextInt();
CO2Data[] arr = new CO2Data[total];
for(int i=0; i<10;i++){
    arr[i] = new CO2Data();
    }
for(int i=0; i<10;i++){ 
    arr[i].setCountry(sc.next());
    arr[i].setTotalCO2(sc.nextDouble());
    arr[i].setRoadCO2(sc.nextDouble());
    arr[i].setCO2PerPerson(sc.nextDouble());
    arr[i].setCarsPerPerson(sc.nextInt());
    }
return arr;
}

问题是,如果我先键入一个无效的文件名然后输入一个有效的名称,程序会说该文件无效,但是如果我先输入一个有效的文件名,那么程序运行正常。那么如何输入有效的文件名首先工作正常,但键入一个无效的名称,然后一个有效的名称使程序给我一个错误信息。

2 个答案:

答案 0 :(得分:0)

好吧,让我们来看看完整的情景:

如果键入无效的文件名,代码将移动到catch块,等待您输入带有该行的新文件名

filename = stdin.nextLine();

您输入有效的文件名,变量filename将重置为新文件名(目前为止好)

然后我们转到While块,它会检查文件是否存在(它确实存在!)好,所以我们转到return语句(它存在问题)

在return语句中,您将返回持有上一个无效文件名的扫描程序。在返回之前,您需要使用新文件重新扫描扫描仪。

我可能会编辑while循环来读取

public static Scanner readFile(String filename){
Scanner stdin = new Scanner(System.in);
File input = new File(filename);
Scanner sc = null;
do {
    try {
        input = new File(filename);
        sc = new Scanner(input);
    }catch(FileNotFoundException e) {
        System.out.println("Filename not valid. Please try again:");
        filename = stdin.nextLine();
    }
} while (!input.exists());
    return sc;
}

这样我们会在收到有效输入后创建一个新的File类,然后返回一个新的Scanner来保存新的input

答案 1 :(得分:0)

您无法从文件名创建新输入 - 因此您始终使用扫描程序中的第一个文件名。这应该有效:

更新代码

public static Scanner readFile(String filename){
    Scanner stdin = new Scanner(System.in);
    Scanner sc = null;
    File input;
    do {
        input = new File(filename);
        try {
            sc = new Scanner(input);
        }
        catch(FileNotFoundException e) {
            System.out.println("Filename not valid. Please try again:");
            filename = stdin.nextLine();
        }
    } while (!input.exists());
    return sc;
}