Jesper的回答几乎涵盖了它。我需要显示一些代码,因此这个单独的答案。
您必须在每种情况下决定如何处理异常。 Jesper和LordSAK都选择返回'假'。与此相关的问题是,您无法区分错误情况与“a”不等于“asd”的情况。
一个可能的解决方案是该方法的返回类型更改为布尔(原始布尔的对象版本),并在情况下返回异常
public static Boolean check() {
try {
return "asd".equals(a);
}
catch(Exception e) {
return null;
}
}
另一种选择是的“空”重新扔你除了作为一个未经检查的异常:
public static boolean check() {
try {
return "asd".equals(a);
}
catch(Exception e) {
throw new RuntimeException("Problem during check", e);
}
}
这种方法的缺点是,代码调用您的支票()方法不指望一个运行时异常被抛出。由于这种类型的异常未经检查,如果开发人员没有用try-catch包围调用check()的话,他将不会收到编译器警告。
第三个选择是声明异常并让你的调用代码处理它。一个完整的例子:
import org.apache.log4j.Logger;
public class Checker {
private static final Logger LOG = Logger.getLogger(Checker.class);
private String a;
public Checker(String value) {
a = value;
}
public boolean check() throws Exception {
return "asd".equals(a);
}
public static void main(String[] args) {
Checker app = new Checker("Stackoverflow");
try {
app.check();
}
catch(Exception e) {
LOG.error("Problem during check", e);
}
}
}
一个优点是,你没有决定哪些值检查()返回一个错误的情况,而是你刚才返回错误本身。这实际上是'抛出'例外的整个想法。作为一个经验法则:如果你不能在方法本身内处理异常,那么抛出它并让调用代码处理它。
来自野外的一个例子:处理异常本身的方法。
private static final long DEFAULT_TIMEOUT = 60000;
public long getTimeout(String timeoutArg) {
try {
return Long.parseLong(timeoutArg);
}
catch(NumberFormatException e) {
return DEFAULT_TIMEOUT;
}
}
注意:我没有编译或运行这些代码,所以可能会出现拼写错误。
在旁注中总是尝试使用“asd”.equals(a)来比较两个字符串,否则您将得到错误的结果。 – Pushkar 2011-04-01 07:29:17
作为一个方面说明,在实验代码中有空的catch块是可以的,但是**不要在生产代码中这样做**(除非你或者你的队友喜欢花费很长时间/晚的时间进行调试,尝试找出神秘错误的根源,那就是)。 – 2011-04-01 07:30:47