无法使try-catch-finally块生效

时间:2013-05-14 09:27:06

标签: java io try-catch finally

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

我不确定我是否真的可以把finally放在try-catch块中。 目前我收到错误消息“Unhandled FileNotFoundException etc.”。我一直在尝试这个很长一段时间,但是无法让它正常工作。

    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();
    }
}

谢谢! :)

3 个答案:

答案 0 :(得分: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。即使你有一个尝试...抓住包装尝试块,它确实捕获FileNotFoundException,异常不会通过嵌套的try..catch语句向上传播

答案 1 :(得分: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();
    }  
}

答案 2 :(得分:0)

将finally块放在try块的外侧。 你不需要内部的try块。