以下是示例代码,非常简单。
Public String method_A() throws Exception{
try{
//do something here
return "result";
}catch(Exception e){
**handleException(e);**
}
}
private void handleException(Exception e) throws Exception{
log.error("", e);
throw new Exception();
}
编译器抱怨“method_A”没有返回值。我的理解是,因为在其catch块中,方法“handleException”总是抛出异常,所以不需要返回值。
我在这里错过了什么吗?
答案 0 :(得分:3)
catch
块只执行if
try
块抛出异常。由于情况并非如此,因此不会抛出异常。
独立于此,即使您认为函数中的所有代码路径都抛出异常,Java也要求您指定显式返回值。虽然编译器能够在简单的情况下解决它(例如C#编译器这样做),但理论上编译器不可能证明不存在非抛出的代码路径。
答案 1 :(得分:1)
Java编译器不知道handleException()
总是抛出异常。它只是认为你处理异常,而不是重新抛出它。 Java编译器不遵循深层代码。
然而,你做错了。你永远不应该沉默你的例外。请这样做:
public String method_A() throws Exception {
try {
// do something here
return "result";
} catch(Exception e) {
handleException(e);
throw e;
}
}
private void handleException(Exception e) {
log.error("", e);
}
或者只是这样,除非你在其他地方使用handleException
:
public String method_A() throws Exception {
try {
// do something here
return "result";
} catch(Exception e) {
log.error("", e);
throw e;
}
}
答案 2 :(得分:1)
仅仅因为你正在处理异常并不意味着你要抛出异常(或者至少是编译器看到的异常)。
有一个机会,如果你的try
块失败,并且你在外部处理异常,你的方法将不会返回任何内容,因此编译将无法防止出现混乱错误
回答我认为是你问题的症结所在:代码无法编译,因为编译器不会逐步调试你的其他方法,看看它是否会抛出异常那里。您必须在方法中抛出的异常,以便编译器“看到”它。
尝试改为内联:
public String method_A throws Exception{
try{
//do something here
return "result";
}catch(Exception e){
log.error("", e);
throw e;
}
}
答案 3 :(得分:0)
由于您将该方法声明为公共字符串,这意味着Java希望您返回一个字符串。如果您没有return语句或者没有特别抛出异常,编译器将不喜欢它。它不是要查看所有代码,以查看是否每次都抛出异常。
答案 4 :(得分:-1)
编译器抱怨,因为它没有看到方法结束时的返回。 try中的代码是作用域。它并没有真正告诉编译器方法是否会返回一个值。如果代码在返回之前抛出异常,它将被转移到catch。通常,在方法结束时返回null(毕竟if,try ends)会使编译器满意。实际上,在eclipse中,如果你编写一个指定了返回类型的方法,首先你要注意编译器告诉你在写一行代码之前是返回值。这是在方法结束时需要返回值的主要原因。