关于java:相应的then子句没有正常完成

The corresponding then clause does not complete normally

在表单中给出一个简单的if语句

1
2
3
4
5
6
7
8
public static String test(boolean flag) {
    if (!flag) {
        return"no";
    } else {
        System.out.println("flag enabled");
    }
    return"yes";
}

1
2
3
4
5
6
7
8
9
10
11
12
public static String test(final boolean flag)
{
    if (flag)
    {
        System.out.println("flag enabled");
        return"yes";
    }
    else
    {
        return"no";
    }
}

Eclipse给了我警告,强调了整个其他块

Statement unnecessarily nested within else clause. The corresponding then clause does not complete normally

然而,这…

1
2
3
4
5
6
7
8
9
public static String test(final boolean flag)
{
    if (flag)
    {
        System.out.println("flag enabled");
        return"yes";
    }
    return"no";
}

不给出警告。

这个问题似乎有关联,但在第一个示例的其他部分中,我没有使用RETURN,否则就不是最后一个。

我知道这只是一个简单的偏好,它可以被关闭。但是,我不喜欢仅仅因为我不明白问题出在哪里而忽视事情。我似乎找不到任何关于Eclipse为什么将此添加为可配置警告的文档。

总而言之,The corresponding then clause does not complete normally是什么意思?这个警告试图保护我不受什么影响?


您可以删除else子句,这将删除警告。

要回答您的另一个问题,"相应的then子句不能正常完成"是指"then"子句有一个返回语句。完成"通常"意味着控制流在"else"块之后继续执行语句,但这不会在返回后发生。

以下各项之间没有逻辑、功能或运行时差异:

1
2
3
4
5
6
7
8
9
// Gets warning
public static String test(final boolean flag) {
    if (flag) {
        System.out.println("flag enabled");
        return"yes";
    } else {
        return"no";
    }
}

1
2
3
4
5
6
7
8
// Doesn't get warning
public static String test(final boolean flag) {
    if (flag) {
        System.out.println("flag enabled");
        return"yes";
    }
    return"no";
}

所以归根结底就是一种风格偏好。为什么Eclipse认为这值得警告?把它想象成类似于"不可到达的代码"——代码的一个方面是不必要的(可能是不正常的)冗长,这通常需要另一种外观,以确保没有逻辑错误被隐藏。如果我写了第一个代码片段并得到警告,我将感谢Eclipse,并愉快地改进代码,到达第二个代码片段。但同样,这只是因为我更喜欢第二个片段。

这里有一个场景,在这个场景中,这可能会起作用并影响功能(无意中)。假设代码最初如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Returns true if the dog was fed
boolean feedDog(Dog dog) {
    if (!dog.isHungry()) {
        return false;
    }
    Food food;
    if (dog.isBadToday()) {
        food = getDefaultFood();
    } else {
        food = getTreat();
    }
    dog.feed(food);
    return true;
}

后来,研究小组决定,如果给狗喂食,feedDog只应返回true。如果代码修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Returns true if the dog was fed *a treat*
boolean feedDog(Dog dog) {
    if (!dog.isHungry()) {
        return false;
    }
    Food food;
    if (dog.isBadToday()) {
        food = getDefaultFood();
        return false; // Dog wasn't fed a treat
    } else {
        food = getTreat();
    }
    dog.feed(food);
    return true;
}

现在有一个bug,因为程序员做了最短的修改,"乍一看就知道"——如果这只可怜的狗行为不当,它就不会被喂饱。Eclipse的警告是把狗保存在这里,告诉程序员注意围绕if语句的逻辑,这看起来不再正确(根据Eclipse)。希望程序员能注意到警告,避免从if块返回:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Returns true if the dog was fed *a treat*
boolean feedDog(Dog dog) {
    if (!dog.isHungry()) {
        return false;
    }
    Food food;
    boolean fedTreat = false;
    if (dog.isBadToday()) {
        food = getDefaultFood();
    } else {
        food = getTreat();
        fedTreat = true;
    }
    dog.feed(food);
    return fedTreat;
}