这是我写的代码的和平:
double value;
String fileName;
Scanner readFile;
Scanner reader=new Scanner(System.in);
System.out.println("Enter a file name:");
fileName=reader.next();
reader.close();
try{
readFile=new Scanner(new FileReader(fileName));
value=readFile.nextDouble();
readFile.close();
}
catch(FileNotFoundException e){
System.err.println("\n The file doen't exist");
}
然后在Catch块中,我想要让用户无限次地询问有效的文件名,直到他输入一个。如果他再次输入无效的文件名,请使用Try-Catch抛出相同的异常。 我该怎么做?谢谢
答案 0 :(得分:4)
Scanner
(不要立即关闭它 - 但要关闭它
它是时候了)。while (true)
)无限期地检查用户输入File
初始化一个新的String
(在循环之前声明它,在循环内初始化它),并检查:
File
API)break
语句退出循环获得File
后,您可以关闭Scanner
(或将其重新用于其他内容)。
您可能还想让用户输入"退出"命令退出循环而不继续,以及通知用户文件是否不存在/不可访问。
答案 1 :(得分:2)
您在应用程序中缺少循环概念。
当您的应用程序期望重复某些行为/操作时。你应该将它包含在一个循环中。 for
和while
有两个循环可用。
当前面已经知道操作次数并且使用迭代器进行操作时,使用for循环。
当你不知道何时会发生某些动作而你只是等待时,会使用while循环。
boolean shouldRetry = true;
while(shouldRetry) {
try {
action();
shouldRetry= false;
} catch(Exception e) {
shouldRetry= true;
}
}
在您的情况下,需要do while
循环,因为您不知道用户何时会提供有效的输入数据。确保操作至少应执行一次。
boolean shouldRetry= false;
do {
try {
action();
shouldRetry= false;
} catch(Exception e) {
shouldRetry= true;
}
}while(shouldRetry)
condition
必须是布尔表达式。它决定是否应该采取行动。
编辑:
如果可能,您应该尝试将代码中的操作分开,以分隔方法。
Scanner reader = new Scanner(System.in);
do {
System.out.println("Enter a file name:");
} while(!processFile(reader.next())); //Read the file name
reader.close();
/**
* @return true if file read with success otherwise false.
*/
private boolean processFile(String fileName) {
try {
//read the file
}catch(Exception e) {
return false;
}
return true;
}
这为您提供了更灵活的行为。使用此功能,您可以在文件无效时重试,不仅因为它不存在,而且还可能是因为它没有您期望的值。