[英]Java File Handling, what did I do wrong?
為Java Homework任務編寫了一個基本的文件處理程序,當我得到了回撥時,我有一些關於未能捕獲一些實例的注意事項:
以下是用於打開文件的代碼塊:
/**
* Create a Filestream, Buffer, and a String to store the Buffer.
*/
FileInputStream fin = null;
BufferedReader buffRead = null;
String loadedString = null;
/** Try to open the file from user input */
try
{
fin = new FileInputStream(programPath + fileToParse);
buffRead = new BufferedReader(new InputStreamReader(fin));
loadedString = buffRead.readLine();
fin.close();
}
/** Catch the error if we can't open the file */
catch(IOException e)
{
System.err.println("CRITICAL: Unable to open text file!");
System.err.println("Exiting!");
System.exit(-1);
}
我從他那里得到的一個評論就是fin.close();
需要處於finally
一塊,我根本沒有。 但我認為我創建try / catch的方式可以避免文件無法打開的問題。
讓我明白一些事情:這不是當前的任務(不是試圖讓某人做我自己的工作),我已經創建了我的項目並且已經對它進行了評分。 我自己並不完全理解教授的推理。 最后,我沒有很多Java經驗,所以我有點困惑為什么我的catch
不夠好。
- 來自文件的緩沖區可能為null。
該文件可能為空。 也就是說,打開文件時會到達文件結尾。 loadedString = buffRead.readLine()
將返回null。
也許你應該通過添加if (loadedString == null) loadedString = "";
類的東西來解決這個問題if (loadedString == null) loadedString = "";
- 找不到檔案
正如FileInputStream(String)
的構造函數的文檔中所解釋的那樣,它可能會拋出FileNotFoundException
。 你確實在你的IOException
子句中捕獲了這個(因為FileNotFoundException
是一個 IOException
),所以沒關系,但是你可能已經完成了:
} catch (FileNotFoundException fnfe) {
System.err.println("File not fonud!");
} catch (IOException ioex {
System.err.println("Some other error");
}
- 文件流未關閉
您可以調用fin.close()
,在正常情況下會關閉文件流。 也許他意味着它並不總是封閉的。 readLine
可能會拋出IOException
在這種情況下會跳過close()
。 這就是在finally
子句中使用它的原因(無論try
-block中發生了什么,都確保它被調用。(*)
(*)正如@mmyers正確指出的那樣,將close()
放在finally
塊中實際上是不夠的,因為你在catch
-block中調用System.exit(-1)
。 如果這確實是所需的行為,則可以在catch子句中設置錯誤標志,如果設置了此標志,則在finally子句之后退出。
但是,如果你的程序在try
塊的第二行或第三行引發異常怎么辦?
buffRead = new BufferedReader(new InputStreamReader(fin));
loadedString = buffRead.readLine();
此時,文件句柄已打開並分配給fin
。 您可以捕獲異常,但文件句柄將保持打開狀態。
您需要將fin.close()
語句移動到finally
塊:
} finally {
try {
if (fin != null) {
fin.close();
}
} catch (IOException e2) {
}
}
假設buffRead.readLine()
拋出異常,您的FileInputStream
是否會被關閉,或者是否會跳過該行? finally
塊的目的是即使在異常的環境中, finally
塊中的代碼也會執行。
除了打開文件之外,還有許多其他錯誤可能發生。
最后,您可能最終得到一個已定義或未定義的fin,您必須防止空指針錯誤,並且不要忘記關閉文件可能會拋出新的異常。
我的建議是在一個單獨的例程中捕獲它,讓IOExceptions飛出它:
就像是
private String readFile() throws IOException {
String s;
try {
fin = new FileInputStream(programPath + fileToParse);
buffRead = new BufferedReader(new InputStreamReader(fin));
s = buffRead.readLine();
fin.close();
} finally {
if (fin != null {
fin.close()
}
}
return s
}
然后你需要它:
try {
loadedString = readFile();
} catch (IOException e) {
// handle issue gracefully
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.