2010-09-21 30 views
2

我主要是一個C#背景(我非常喜歡新手),所以原諒我,如果我的假設是基於這個問題。在Java中檢查異常和File.exists()

簡而言之,我正在使用的一個軟件(Java)中的一個功能是用戶輸入一個文件名。我打算做的是讓程序循環,並將字符串附加到可能的附加字符串數組的文件名的末尾,以查看文件是否存在,如果存在,請將其打開。我保證只有一個給定名稱的文件,所以在第一次成功時突破循環並不是一個錯誤(如果用戶指定的文件名是「foo」,並且appendStrings數組有「bar」和「巴茲「的內部,我保證在目錄中永遠不會有」foobar「和」foobaz「)。我最終得出的結果與此類似:

public FileReader LocateFile(String fileName) 
{ 
    FileReader toReturn = null; 
    for(int i = 0; i < appendStrings.length; i++) 
    { 
     File locatedFile = new File(fileName + appendStrings[i]); 
     try 
     { 
      toReturn = new FileReader(locatedFile); 
     } 
     catch(FileNotFoundException ex) 
     { 
      continue; 
     } 
    } 
    //...handling in case I didn't find a file. 
} 

太好了,它工作得很好。除了兩個問題:

  1. 編譯器讓我很不滿,我聲明瞭一個我沒有使用的變量(ex)。我想我可以記錄異常或其他東西,但這看起來很荒謬,因爲這會經常發生,而且我寧願不用過多的噪音填充我的日誌文件,只是爲了讓編譯器感到高興。
  2. 我已經從無數來源讀到您不使用異常來控制程序的流程;你用它們爲例外的情況。

我的問題是:有沒有辦法在這種情況下取​​悅編譯器?我捕捉FileNotFoundException,所以使用File.exists()不會真的解決我的問題。我是在倒退,還是這是Java如何滾動?

+0

您還應該考慮File#exists()返回false,而引發FileNotFoundException的新FileReader(File)不具有相同的語義含義。對於目錄,文件#exists()將返回true,對於沒有讀權限的普通文件,可能會返回true,而在這些情況下,FileReader將引發FileNotFoundException。 – jarnbjo 2010-09-21 16:23:53

回答

0

對於例外情況,第一件事情是正確的,它們應該只在特殊情況下使用。

第二點,你的代碼繼續;沒有必要。如果拋出異常,則繼續循環,但如果沒有拋出異常會發生什麼?
那麼,你繼續循環。

第三點,編譯器不會因爲ex變量而不高興,只有你的IDE告訴你變量沒有被使用,不用擔心它會發生很多事情。

+0

@SuppressWarning可能有幫助 – 2010-09-21 16:16:51

+0

你是絕對正確的;它是IDE,而不是編譯器,它會產生警告。我可以忍受IDE不高興。 – Sepulchritude 2010-09-21 16:52:39

+0

在IntelliJ中,您可以調用異常「忽略」或「忽略」,或者在catch塊中放置註釋以說明忽略該異常的原因。這可能也適用於您的IDE。 – 2010-09-21 18:12:00

3

你是對的,你不應該使用異常來控制你的程序流程。

您已經在平面字符串中編寫了算法,只是將其轉換爲Java代碼。

public FileReader LocateFile(String fileName) 
{ 
    FileReader toReturn = null; 
    for(int i = 0; i < appendStrings.length; i++) 
    { 
     File locatedFile = new File(fileName + appendStrings[i]); 
     if(locatedFile.exists()) { 
      toReturn = new FileReader(locatedFile); 
      break; 
     } 
    } 
    //...handling in case I didn't find a file. 
} 
+1

是的!如果API提供了一個呼叫來爲你做這項工作,你應該使用呼叫! +1 – 2010-09-21 16:16:05

+2

除了......它不會那樣工作。你會得到一個未報告的FileNotFoundException編譯錯誤。其次,如果操作系統在locateFile.exists()返回true之後並在「new FileReader()」行執行之前刪除文件(或者某人打開它或以其他方式鎖定文件),會發生什麼情況? – Sepulchritude 2010-09-21 16:49:12

+0

您仍需要捕獲創建FileReader時可能引發的FileNotFoundException。 – Grodriguez 2010-09-21 16:52:42

1

我從您不使用異常來控制程序的流程無數源中讀取;你在特殊情況下使用它們。

您應該測試該文件是否存在與File.exists()而不是使用例外用於此目的。你是對的,因爲在創建FileReader對象時仍然需要捕捉異常,但正如其他人指出的那樣,文件可能存在,並且您仍然可能無法使用FileReader來讀取它。這兩種情況必須分開考慮。

編譯器讓我很不高興,我聲明瞭一個我沒有使用的變量(ex)。我想我可以記錄異常或其他東西,但這看起來很荒謬,因爲這會經常發生,而且我寧願不用過多的噪音填充我的日誌文件,只是爲了讓編譯器感到高興。

確實。但是,如上所述,您應該首先使用File.exists()進行測試,如果該文件似乎存在但您無法創建FileReader,那麼是您應該處理的問題。

順便說一句,我的編譯器和我的IDE都沒有警告這個未使用的變量。也許你的IDE中有一個設置?

+0

所以處理這種情況的「kosher」方法是繼續並首先檢查File.exists(也可能是File.IsADirectory和File.CanRead),如果這兩者都很好但使用異常,但創建FileReader仍然失敗。我大部分都被絆倒在「FileNotFoundException」的語義上,因爲我認爲它被拋出意味着該文件是......好的,沒有找到。 – Sepulchritude 2010-09-21 17:15:02

+0

這就是我處理它的方式,是的。你對'FileNotFoundException'這個有點誤導性的名字是正確的;這個異常實際上用於表示幾種不同的錯誤情況,其中一些涉及現有文件,由於各種原因無法打開。 – Grodriguez 2010-09-21 17:31:31

+0

如果它對您有用,您可能想要接受答案(綠色勾號):-) – Grodriguez 2010-09-22 12:38:16