簡體   English   中英

這是在 Java 中傳遞輸入文件的壞習慣嗎?

[英]Is this bad practice for passing an input file in Java?

我有一個主類,它希望通過命令行參數提供一個輸入文件名; 如果這不是真的,則程序退出並顯示錯誤消息。

我們假設存在一個名為 SudokuReducer 的類。 確定有輸入文件后,主函數會將輸入文件(不僅僅是文件名)傳遞給 SudokuReducer 的一個實例。

我想知道的是,這是不好的形式/做法嗎? 像這樣將整個掃描放在 try/catch 中是錯誤的嗎? 因為如果我想在 try/catch 之外的“main”中聲明 SudokuReducer 實例,而不是在其中,我不能,因為它無法識別傳遞了什么“fileInput”,因為它在“try”中的范圍有限'

有沒有更好的方法來做到這一點? 這是我所擁有的:

import java.io.File;

public class MainMV {

File inputFile;

public static void main(String args[]) {

    // check if file is entered and handle exception
    try {
        if (args.length > 0) {
            File inputFile = new File(args[0]);

            System.out.println("Processing file");
            SudokuReducer reducer = new SudokuReducer(inputFile);

        } else {
            System.out.println("No file entered.");
            System.exit(1);
        }

    } catch (Exception e) {
        System.out.println("File failed to open.");
        System.exit(1);
    }

}

}

回答標題中的問題:不,如果該方法需要File來完成其工作,這不是壞習慣。

另一種選擇是傳遞一個String 這是一個糟糕的選擇,因為它沒有傳達參數應該代表某種File

也許更好的選擇是將InputStream傳遞給該方法,因為 a) 清楚地表明它將用於輸入(而不是您將寫入的File ); b) 它更靈活,因為它不必引用磁盤上的文件。


要回答問題中的問題:不,像這樣將所有內容都包含在一次 try/catch 中並不是一個很好的做法。 很難區分失敗的模式:您的代碼中可能會出現許多不同的問題,最好分別處理這些問題,例如提供特定的失敗消息。

構建代碼的更好方法是這樣的:

if (args.length == 0) {
  System.out.println("No file entered.");
  System.exit(1);
}

File inputFile = new File(args[0]);
System.out.println("Processing file");
try {
  SudokuReducer reducer = new SudokuReducer(inputFile);
  // Do something with reducer.
} catch (IOException e) {
  e.printStackTrace();
  System.out.println("File failed to open.");
  System.exit(1);
}

請注意,它具有處理特定錯誤的小塊,而不是將錯誤處理與導致錯誤的事物分開的大塊。

另外,請注意,它沒有捕獲Exception :除非必須這樣做,否則您真的不想這樣做,因為您沒有正確處理它會捕獲的必須以特殊方式處理的異常(即InterruptedException )。 捕獲最具體的異常類型。

根據我的理解,Java 將參數作為對象的引用按值傳遞,這對我來說非常令人困惑。

鏈接到按引用傳遞與按值傳遞的解釋

鏈接到 Java 實現的解釋

根據生成 SudokuReducer 類實例所需的文件信息量,此操作的開銷可能很大。 如果是這種情況,您將需要在 main 方法中逐行解析您的輸入。

 try {
     SudokuReducer reducer = SudokuReducer.makeSudokuReducer(args[0])
  }
 catch(Exception e) { 
     System.out.println("No file entered.");
     System.exit(1);
 }

這是逐行讀取文件的示例有很多方法可以做到這一點,但我能想到的最有效的方法是使用 Java 8 的 Stream 和 Files 類。

方法簽名將如下所示:

public static SudokuReducer makeSudokuReducer(String filename) {
    //Open file
    //Parse input line by line
    //Use information to create a new instance of your class
    //Return the instance of this class
}

您將能夠在任何地方調用此靜態方法以根據文件名生成類的新實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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