【发布时间】:2012-04-07 17:45:20
【问题描述】:
我对 Java 很陌生。我正在编写一个程序来读取文件,计算其 SHA1 校验和,并将结果写入另一个文件。在出现任何错误时,我都会调用一个函数 err_exit(),它会向 stderr 打印一条消息,并通过调用具有指定退出状态的 System.exit() 来终止执行。这大概是我的main() 函数的样子:
public static void main(String[] args) {
String in_fname = "C:/tmp/test.txt"; // not reading args yet
String out_fname = "C:/tmp/test.sign";
byte[] file_data;
String hexdigest;
try {
file_data = readFileAsByteArray(in_fname);
}
catch (java.io.IOException ex) {
file_data = new byte[] {0}; // note this line well, please
err_exit(2, "error opening input file '" + in_fname + "'");
}
try {
hexdigest = hexdigestSha1(file_data);
}
catch (NoSuchAlgorithmException ex) {
hexdigest = ""; // note this line well, please
err_exit(3, "could not compute SHA1 message digest!");
}
try {
writeFileFromString(out_fname, hexdigest);
}
catch (java.io.IOException ex) {
err_exit(2, "error writing output file '" + out_fname + "'");
}
System.exit(0); // success
}
有两行我要求你注意。这两行的存在只是为了防止编译器抱怨变量可能没有被初始化。
就编译器所知,catch 块可能会继续。实际上err_exit() 永远不会返回,因此不会传递无效值。
那么,我的问题是:处理这类事情的常用 Java 习语是什么? try/catch 块的行有点难看;你会建议我让各种函数调用err_exit() 并且没有像这样显式的代码吗?我想我更喜欢显式检查,main() 函数是进行检查的正确位置,但我对反馈感兴趣。
如果我要使用 try/catch 块,这是消除编译器警告的好方法吗?
如果我在 Python 中执行此操作,我可能不会捕获异常,并让程序停止并返回堆栈跟踪。错误的堆栈跟踪不会让这个程序的用户感到震惊,因为那个用户就是我。我突然想到,如果我将main() 函数声明为throws Exception,那么我就无法捕获异常,它的行为类似于 Python。这是一个可怕的想法,会让思想正确的 Java 人回避我吗?
附:如果您有最喜欢的书/网页/我应该阅读的任何 Java 习语,请提及。
编辑:对于带有下划线的变量名,我深表歉意。我已经在我的真实程序中重命名了它们,但我将把它们留在这里。这实际上是因为我花了很多时间在 Python 和 C 编程;我使用的是 Python “PEP 8” 样式或通用 C 样式,请自行选择。
【问题讨论】:
-
张贴声明这两个变量的行。
-
我添加了缺失的东西以使其成为一个完整的功能。它看起来更好,因为 StackOverflow 现在正在做语法着色......以前不是!
标签: java