[英]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 將參數作為對象的引用按值傳遞,這對我來說非常令人困惑。
根據生成 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.