system.err.println和刚抛出异常之间的区别? (Java)的

时间:2017-02-18 20:36:34

标签: java io filenotfoundexception

我正在尝试打开并读取从命令行传递的文件。

这是我到目前为止所做的:

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
   }
}

我只需要确保用户实际传递一个字符串作为文件名并且它是否存在/可以读取。

3 个答案:

答案 0 :(得分:1)

例外可以更容易地以编程方式处理错误。

含义:当你的程序只包含一个main函数时,你想告诉用户"文件不存在&#34 ;;如果你的程序向stderr打印一个合理的消息,那么它就不会产生太大的差别;然后存在一些非零返回码;或者如果你抛出异常。

恰恰相反;在你的简单例子中;具有一个精确错误消息实际上优先于抛出异常并让JVM向用户打印(可能令人困惑的)堆栈跟踪。

但是:您当前的程序只是一个小例子。一旦事情变得越来越大,你的程序就会包含对不同组件中许多不同类的调用。然后打印到stderr不再是一个好主意。然后,您需要确保遇到问题的一个层具有定义的方式来传达这种情况;这就是例外意味着什么。在这种情况下,你更喜欢例外;因为一些更高层可以抓住它们 - 然后决定做什么。例如,程序可以决定在某个UI面板上显示错误消息;或者将消息放入日志文件中;或发短信给某些手机。如果你只打印到stderr,那么所有这些都几乎是不可能的。

答案 1 :(得分:0)

catch而不是// exception handled here,您可以编写任何所需的代码。 如果你只是抛出异常 - java本身做了一些标准的东西。

答案 2 :(得分:0)

花点时间阅读Joshua Bloch的Effective Java(第2版)书籍。 项目57(仅在例外条件下使用例外)在“例外”一章中将阐明本主题中的所有内容。