方法重载产生java.lang.StackOverflowError

时间:2018-09-05 12:51:21

标签: java stack-overflow

据我所知,java具有方法重载功能,因此我很有趣,为什么注释为B的方法会产生java.lang.StackOverflowError。我认为这可能与某些递归调用有关,但是我没有任何编译器警告。有人可以解释我为什么会例外。

    public static void main(String[] args) {
        Set<Integer> set = getSet(1);
    }

    //A
    private static Set<Integer> getSet(List<Integer> numbers) {
        return new HashSet<>(numbers);
    }

    //B throwing exception
    private static Set<Integer> getSet(Integer number) {
        return getSet(number);
    }

3 个答案:

答案 0 :(得分:4)

此:

private static Set<Integer> getSet(Integer base) {
    return getSet(base);
}

自称;您可能想用List来调用它:

return Arrays.asList(base); // or List.of(base) since java-9

答案 1 :(得分:4)

只需查看您的getSet方法。您一次调用它,它再次调用它自己。

也许您想这样做?

private static Set<Integer> getSet(Integer base) {
        return getSet(Arrays.asList(base));
    }

答案 2 :(得分:0)

您无限次致电private static Set<Integer> getSet(Integer number)。第一次调用来自public static void main(String[] args),此后方法将自行调用,而无需进行任何检查以中断自调用序列

 private static Set<Integer> getSet(Integer number) {
    return getSet(number);
 }

getSet已重载,但类型为number的{​​{1}}会自行调用。这变成了相同方法调用的无限序列,并且随着每个方法调用的结果进入堆栈中的一个条目(以存储方法调用的本地状态),堆栈需要具有阈值的内存,该内存在某个数量的方法调用产生后会耗尽在Integer中。

如果从编译器的角度来看,此类调用也没有错。唯一必须进行条件检查才能防止递归转换为无限递归。