我已经努力让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();
}
}
谢谢! :)
答案 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块。