system.err.println 和抛出异常之间的区别? (java)
difference between system.err.println and just throwing an exception? (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
}
我不完全确定我应该如何处理文件未找到异常。我的老师提到了 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
}
}
我只需要确保用户实际传递了一个字符串作为文件名并且exists/can 被读取。
异常使得以编程方式处理错误变得更加容易。
意思是:当你的程序只有一个main函数,而你想告诉用户"a file is not there";如果您的程序向 stderr 打印一条合理的消息,那么它并没有太大的区别;然后存在一些 non-zero return 代码;或者如果你抛出异常。
相反;在你的简单例子中; 一个 精确的错误消息实际上比抛出异常和让 JVM 向用户打印(可能令人困惑的)堆栈跟踪更好。
但是:你现在的程序只是一个小例子嘛。一旦事情变得更大,您的程序就会包含对不同组件中许多不同 类 的调用。然后打印到 stderr 不再是一个好主意。然后,您要确保遇到问题的一层有明确的方式来传达这种情况;这就是例外的意义所在。在这种情况下,您更喜欢异常;因为一些更高层可以抓住他们 - 然后决定做什么。例如,程序可以决定在某些 UI 面板上显示错误消息;或将消息放入日志文件;或者向某个手机 phone 发送短信。如果您只打印到 stderr,所有这一切几乎是不可能的。
在 catch
而不是 // exception handled here
中,您可以编写任何您想要的代码。
如果你只是抛出异常 - java 本身在做一些标准的事情。
花点时间阅读 Effective Java(第 2 版),作者是 Joshua Bloch。
异常一章中的第 57 项(仅在异常情况下使用异常)将阐明本主题中的所有内容。
我正在尝试打开并读取从命令行传递的文件。
这是我目前拥有的:
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
}
}
我只需要确保用户实际传递了一个字符串作为文件名并且exists/can 被读取。
异常使得以编程方式处理错误变得更加容易。
意思是:当你的程序只有一个main函数,而你想告诉用户"a file is not there";如果您的程序向 stderr 打印一条合理的消息,那么它并没有太大的区别;然后存在一些 non-zero return 代码;或者如果你抛出异常。
相反;在你的简单例子中; 一个 精确的错误消息实际上比抛出异常和让 JVM 向用户打印(可能令人困惑的)堆栈跟踪更好。
但是:你现在的程序只是一个小例子嘛。一旦事情变得更大,您的程序就会包含对不同组件中许多不同 类 的调用。然后打印到 stderr 不再是一个好主意。然后,您要确保遇到问题的一层有明确的方式来传达这种情况;这就是例外的意义所在。在这种情况下,您更喜欢异常;因为一些更高层可以抓住他们 - 然后决定做什么。例如,程序可以决定在某些 UI 面板上显示错误消息;或将消息放入日志文件;或者向某个手机 phone 发送短信。如果您只打印到 stderr,所有这一切几乎是不可能的。
在 catch
而不是 // exception handled here
中,您可以编写任何您想要的代码。
如果你只是抛出异常 - java 本身在做一些标准的事情。
花点时间阅读 Effective Java(第 2 版),作者是 Joshua Bloch。 异常一章中的第 57 项(仅在异常情况下使用异常)将阐明本主题中的所有内容。