4

我一直在努力让 try-catch-finally 块起作用。我是java初学者,目前正在学习如何读/写/处理异常。在我的任务中,我试图从两个单独的 .txt 文件中读取。一个有国家和人口,另一个有国家和地区。这将进一步打印到一个新文件中,其中显示有关每个人的国家和地区的信息。

我不确定我是否真的可以将 finally 放入 try-catch 块中。目前我收到错误消息“未处理的 FileNotFoundException 等”。我已经尝试了很长时间,但无法使其正常工作。

    private String country;
private double value;



Scanner in1 = new Scanner(new File("countryPopulation.txt"));
Scanner in2 = new Scanner(new File("countryArea.txt"));

PrintWriter out = new PrintWriter("countryAreaPerInhabitant");

public IOAndExceptionHandling(String line) {
    int i = 0;
    while (!Character.isDigit(line.charAt(i))) {
        i++;
    }
    this.country = line.substring(0, i - 1).trim();
    this.value = Double.parseDouble(line.substring(i).trim());
}

public String getCountry() {
    return this.country;
}

public double getValue() {
    return this.value;
}

public void printAreaPerPerson() {
    try {   
        try {
            while (in1.hasNextLine() && in2.hasNextLine()) {
                IOAndExceptionHandling country1 = new IOAndExceptionHandling(in1.nextLine());
                IOAndExceptionHandling country2 = new IOAndExceptionHandling(in1.nextLine());                   
                double density = 0;
                if (country1.getCountry() == country2.getCountry()) {
                    density = country2.getValue() / country1.getValue();
                    out.println(country1.getCountry() + " : " + density);
                }
            }
        }
        finally {
            in1.close();
            in2.close();
            out.close();
        }
    }
    catch (FileNotFoundException f) {
        System.out.println("FileNotFound!");
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

谢谢!:)

4

3 回答 3

4

finally 块在 catch 块之后。无论抛出异常或成功完成块,它都会执行。

Scanner in1; //field declaration with no assignment
Scanner in2; //field declaration with no assignmetn

    /* Omitted Class declaration & other code */

try {
    in1 = new Scanner(new File("countryPopulation.txt")); //these require FNF to be caught
    in2 = new Scanner(new File("countryArea.txt"));
    while (in1.hasNextLine() && in2.hasNextLine()) {
        IOAndExceptionHandling country1 = new IOAndExceptionHandling(
                in1.nextLine());
        IOAndExceptionHandling country2 = new IOAndExceptionHandling(
                in1.nextLine());
        double density = 0;
        if (country1.getCountry() == country2.getCountry()) {
            density = country2.getValue() / country1.getValue();
            out.println(country1.getCountry() + " : " + density);
        }
    }
} catch (FileNotFoundException f) {
    System.out.println("FileNotFound!");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    in1.close();
    in2.close();
    out.close();
}

这段代码的第一个版本是抛出未处理的异常错误,因为内部 try 块没有捕获FileNotFoundException. 即使您有一个 try...catch 包装了该 try 块,它确实捕获了FileNotFoundException,但异常不会通过嵌套的 try..catch 语句向上传播

于 2013-05-14T09:29:30.207 回答
2

您正在嵌套两个try catch块。内部只有try finally,但没有catch语句。那就是FileNotFoundException会发生的地方。

try {   
        try {

要么删除外部块并只使用一个,要么将catch语句移到内部 try finally

复制粘贴这个

public void printAreaPerPerson() { 
     try {
        while (in1.hasNextLine() && in2.hasNextLine()) {
            IOAndExceptionHandling country1 = new IOAndExceptionHandling(in1.nextLine());
            IOAndExceptionHandling country2 = new IOAndExceptionHandling(in1.nextLine());                   
            double density = 0;
            if (country1.getCountry() == country2.getCountry()) {
                density = country2.getValue() / country1.getValue();
                out.println(country1.getCountry() + " : " + density);
            }
        }
    } catch (FileNotFoundException f) {
            System.out.println("FileNotFound!");
    } catch (IOException e) {
            e.printStackTrace();
    } finally {
            in1.close();
            in2.close();
            out.close();
    }  
}
于 2013-05-14T09:29:43.353 回答
0

将 finally 块放在 try 块的一侧。您不需要内部 try 块。

于 2013-05-14T09:33:18.363 回答