簡體   English   中英

Java文件處理,我做錯了什么?

[英]Java File Handling, what did I do wrong?

為Java Homework任務編寫了一個基本的文件處理程序,當我得到了回撥時,我有一些關於未能捕獲一些實例的注意事項:

  • 來自文件的緩沖區可能為null。
  • 找不到檔案
  • 文件流未關閉

以下是用於打開文件的代碼塊:

/**
 * 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM