2011-09-05 80 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 */ 
    } 
} 
相關問題