据我所知,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);
}
答案 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
中。
如果从编译器的角度来看,此类调用也没有错。唯一必须进行条件检查才能防止递归转换为无限递归。