2011-09-05 78 views
0

我有一个称为readinFile的方法,如果用户输入错误的文件而不是退出,我想在readinFile方法内再次调用readinFile方法,我要求用户输入新的文件名。我遇到的问题是它第一次遇到它,并且发现异常文件比通过catch()时找不到。我希望它调用该方法,而不是运行最后一个inputStream。如果抛出异常,我该如何调用方法?

try 
{ 
    inputStream = new Scanner(new FileInputStream(fileName)); 
} 
catch(FileNotFoundException E) 
{ 
    readinfile(table, numberOfColumns, header, 
       original, sntypes,displaySize, 
       writeOut,inputStream,fileName); 
    System.out.print("It got here after doing the method call");   
} 
+0

我不认为这是一个很好的设计,声音喜欢它应该做你想做的。目前尚不清楚发生了什么 - 请提供更多代码。 –

+2

我读了你的问题4次,并不明白你的问题是什么 – Bozho

+0

它将读取文件,而不是回到方法调用之前的位置。 – Ashley

回答

2

您通常不应该使用例外进行分支。只要检查该文件是否存在等使用File.exists,就像这样:

new File(fileName).exists() 
+1

请注意,在检查存在和文件的实际使用(假设应该读取)之间,文件系统可能已更改,并且文件可能已被删除/重命名/修改。因此,当你真正阅读文件时,除非你有其他原因,否则你不能认为它仍然存在,并且'FNFE'可能会被抛出! –

+0

是的,但这是一个非常非常罕见的Scenerio,然后真的会保证一个例外。而用户输入后文件不存在是正常流程。 –

2

你可能想要做这样的事情:

String fileName; 

do { 
    System.out.println("Please enter filename"); 
    fileName = getFileNameFromInput(); 
    File file = new File(fileName); 
} while (!file.exists()); 

readFile(file); 

编辑:

布鲁诺·雷斯指出这只会检查当用户指定文件名时文件是否存在。如果要在指定文件名和读取文件之间移动/删除文件,则FileNotFoundException仍将被抛出。 为了降低此风险,您可以锁定文件,如this question中所述。

+0

与以下相同:当'readFile'中的代码被执行时,文件可能已经被删除(即使它存在于'file.exists()'检查中,readFile中的代码应该准备好处理一个'FNFException'(除非由于某些原因,你可以保证文件一旦存在,就不能被删除) –

+0

在这种情况下,他的原始尝试可能是最简单的解决方案 – luketorjussen

0
bool invalidFilename = true; 
string fileName; 

while(invalidFilename) 
{ 
    readinfile(...); 
    invalidFilename = !new File(fileName).exists(); 
} 

inputStream = new Scanner(new FileInputStream(fileName)); 
0

您可以检查用户输入的文件名是否存在,并且不需要捕获异常。 (这是不是一个很好的设计代码,减少代码的可读性)....

为inflagranti说,

你可以这样做伪

if (!new File(filename).exists()){ 
    //read your other file from user 
    readinfile(....) 

} 
+0

你必须捕捉异常,这是一个检查的例外。 – TofuBeer

0

为了得到你所追求的,但没有文件被删除后,你检查它存在,但在你打开之前做它像这样的事情:

boolean done = false; 
String fileName = fileNameParameter; 

while(!done) 
{ 
    try 
    { 
     inputStream = new Scanner(new FileInputStream(fileName)); 
     done = true; 
    } 
    catch(FileNotFoundException E) 
    { 
     fileName = /* ask the user for the file name */ 
    } 
} 
相关问题