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

Java system.err.println和仅仅抛出异常之间的区别?(爪哇),java,io,filenotfoundexception,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()) ) { Syst

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

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

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

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

异常使以编程方式处理错误变得更容易

意思是:当你的程序只包含一个主函数,你想告诉用户“文件不在那里”;如果你的程序向stderr输出了一条合理的消息,那么它不会有太大的区别;然后存在一些非零返回码;或者如果抛出异常

相反,;在你的简单例子中;实际上,与抛出异常和让JVM向用户打印(可能令人困惑的)堆栈跟踪相比,拥有一条准确的错误消息更可取


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

catch
中,而不是
//这里处理的异常
您可以编写任何想要的代码。
如果你只是抛出异常——java本身正在做一些标准的事情。

慢慢来,阅读Joshua Bloch的《高效java》(第二版)书籍。
“例外”一章中的第57项(仅在例外情况下使用例外情况)将阐明本主题中的所有内容。

不同之处在于它们不相同。一个打印输出到控制台。另一个改变程序流程。这些都有记录。没有必要猜测。