我正在尝试打开并读取从命令行传递的文件。
这是我到目前为止所做的:
import java.io.*;
public class Test {
public static void main(String[] args) throws FileNotFoundException {
if ( (args[0].length() == 0) || (args[0] == null) || (args[0].isEmpty()) ) {
System.err.println("Usage Error: No file name was provided.");
System.exit(1);
}
File file = new File(args[0]);
if (!file.exists()) {
System.err.println("Usage Error: The file, " + args[0] + ", does not exist.");
}
if (!file.canRead()) {
System.err.println("Usage Error: The file, " + args[0] + ", cannot be read.");
}
} // main
}
我不完全确定如何处理文件未找到的异常。我的老师提到了try / catch块,但我不确定我是否需要这些。只是测试文件是否作为参数传递,是否使用System.err.print()方法给用户一个错误是否足够?
另外,如果调用System.err.print(),它会在那之后退出程序(意味着,之后是否需要包含System.exit(1))?或者更好(在设计方面)只做这样的事情:
public void readFile() throws FileNotFoundException {
// try to open file here
}
public static void main(String[] args) {
try {
readFile();
} catch (Exception e) {
// exception handled here
}
}
我只需要确保用户实际传递一个字符串作为文件名并且它是否存在/可以读取。
答案 0 :(得分:1)
例外可以更容易地以编程方式处理错误。
含义:当你的程序只包含一个main函数时,你想告诉用户"文件不存在&#34 ;;如果你的程序向stderr打印一个合理的消息,那么它就不会产生太大的差别;然后存在一些非零返回码;或者如果你抛出异常。
恰恰相反;在你的简单例子中;具有一个精确错误消息实际上优先于抛出异常并让JVM向用户打印(可能令人困惑的)堆栈跟踪。
但是:您当前的程序只是一个小例子。一旦事情变得越来越大,你的程序就会包含对不同组件中许多不同类的调用。然后打印到stderr不再是一个好主意。然后,您需要确保遇到问题的一个层具有定义的方式来传达这种情况;这就是例外意味着什么。在这种情况下,你更喜欢例外;因为一些更高层可以抓住它们 - 然后决定做什么。例如,程序可以决定在某个UI面板上显示错误消息;或者将消息放入日志文件中;或发短信给某些手机。如果你只打印到stderr,那么所有这些都几乎是不可能的。
答案 1 :(得分:0)
在catch
而不是// exception handled here
,您可以编写任何所需的代码。
如果你只是抛出异常 - java本身做了一些标准的东西。
答案 2 :(得分:0)
花点时间阅读Joshua Bloch的Effective Java(第2版)书籍。 项目57(仅在例外条件下使用例外)在“例外”一章中将阐明本主题中的所有内容。