system.err.println和只是抛出例外的区别?(Java)



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

这是我到目前为止所拥有的:

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
}

我不确定如何处理文件,没有发现例外。我的老师提到了尝试/捕获障碍,但我不确定是否需要这里。仅测试文件是否作为参数传递以及是否不使用System.err.print()方法来给用户一个错误是足够的吗?

另外,如果称为system.err.print(),是否在此之后退出该程序(这是指我需要在此之后包含system.exit.exit.exit.exit)吗?还是(就设计而言)做这样的事情是更好的:

public void readFile() throws FileNotFoundException {
    // try to open file here
}
public static void main(String[] args) {
   try {
       readFile(); 
   } catch (Exception e) {
       // exception handled here
   }
}

我只需要确保用户实际将字符串作为文件名传递,并且可以读取。

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

含义:当您的程序仅由主要功能组成时,您想告诉用户"不存在文件";如果您的程序向STDER打印出合理的消息,那么它并没有太大的不同。然后使用一些非零返回代码来存在;或者如果您抛出异常。

相反;在您的简单示例中;具有一个精确错误消息实际上是优先于抛出异常,并使JVM print a(可能令人困惑的)堆栈跟踪给用户。

但是:您的当前程序只是一个小示例。一旦情况变得更大,您的程序就会由对不同组件中许多不同类别的呼叫组成。然后打印到stderr不再是个好主意。然后,您要确保遇到问题的一层具有通信这种情况的定义方法。这就是例外的目的。在这种情况下,您非常喜欢例外;因为一些较高的一层可以抓住它们 - 然后决定该怎么做。例如,该程序可以决定在某些UI面板上显示错误消息;或将消息放入日志文件中;或将短信发送到某些手机。如果您仅印刷到stderr。

,所有这些都是不可能的

catch中,// exception handled here中您可以编写所需的任何代码。如果您只是抛出异常-Java本身在做一些积极的事情。

花点时间阅读有效的Java(第二版)书籍Joshua Bloch。项目57(仅适用于特殊条件的例外)在章节中,例外将澄清此主题中的所有内容。

最新更新