我一直在练习扫描仪和异常,但它们相当新,所以也许我在这里遗漏了一些东西:
编译器说它无法找到文件名或f的第一种方式。
do {
try {
System.out.print("Enter the file name: ");
String filename = k.nextLine();
Scanner f = new Scanner(new File(filename));
done = true;
}
catch(FileNotFoundException ex1){
System.out.println("The file "+filename+" does not exist.");
}
catch(Exception e){
System.out.println("Unpredicted exception");
}
} while (!done);
我以为我会把它放在外面修复它,但另一种方式它抱怨f和文件名可能尚未初始化
Scanner k = new Scanner(System.in), f;
String filename;
boolean done = false;
// Request file from the user
do {
try {
System.out.print("Enter the file name: ");
filename = k.nextLine();
f = new Scanner(new File(filename));
done = true;
}
catch(FileNotFoundException ex1){
System.out.println("The file "+filename+" does not exist.");
}
catch(Exception e){
System.out.println("Unpredicted exception");
}
} while (!done);
答案 0 :(得分:1)
将filename的值初始化为null。这样,如果输入了catch块,当您打印错误消息时,它仍然会有一个值。
String filename = null;
答案 1 :(得分:1)
在'try'块开始之前,您必须始终在这种条件下声明和初始化变量。否则你将不得不面对这些错误: '找不到符号', '变量未初始化'。
在你的代码中你已经在'try'块之外声明了String变量,这很好,但问题是你还没有初始化它。希望它能解决你的问题。
答案 2 :(得分:1)
变量的范围是它声明的块。您的第一个版本在filename
块中声明为try
,但您尝试在catch
块中使用它(尽管属于 块一个try-catch
句法结构。
您的第二次尝试通过声明变量的范围包含其使用的所有位置来修复此问题,但是在java局部变量中没有默认的初始化值;如果存在可能导致在 之前访问变量的代码路径,则必须提供值。已为其分配了值。
修复是在null
。之前的变量中提供任何值(包括try-catch
),无论是在声明时,还是在声明之后的行中。