为什么要求退货价值?

时间:2014-09-07 00:12:02

标签: java

以下是示例代码,非常简单。

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”总是抛出异常,所以不需要返回值。

我在这里错过了什么吗?

5 个答案:

答案 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中,如果你编写一个指定了返回类型的方法,首先你要注意编译器告诉你在写一行代码之前是返回值。这是在方法结束时需要返回值的主要原因。