是否可以在没有递归的情况下获得StackOverflowError?

Вад*_*нюк 5 java stack-overflow

我有一个任务是在java中获取"StackOverflowError"而不使用-Xss和递归.我真的没有想法...只有一些废话,比如在运行时生成巨大的java类,编译它并调用...

hid*_*ide 3

编辑:

答案是不正确的,因为它是递归的一种。它称为间接递归https://en.wikipedia.org/wiki/Recursion_(computer_science)#Indirect_recursion

我认为无需递归即可实现此目的的最简单方法如下:

import java.util.LinkedList;
import java.util.List;

interface Handler {
    void handle(Chain chain);
}

interface Chain {
    void process();
}

class FirstHandler implements Handler {
    @Override
    public void handle(Chain chain) {
        System.out.println("first handler");
        chain.process();
    }
}

class SecondHandler implements Handler {
    @Override
    public void handle(Chain chain) {
        System.out.println("second handler");
        chain.process();
    }
}

class Runner implements Chain {
    private List<Handler> handlers;
    private int size = 5000; // change this parameter to avoid stackoverflowerror
    private int n = 0;

    public static void main(String[] args) {
        Runner runner = new Runner();
        runner.setHandlers();
        runner.process();
    }

    private void setHandlers() {
        handlers = new LinkedList<>();
        int i = 0;
        while (i < size) {
            // there can be different implementations of handler interface
            handlers.add(new FirstHandler());
            handlers.add(new SecondHandler());
            i += 2;
        }
    }

    public void process() {
        if (n < size) {
            Handler handler = handlers.get(n++);
            handler.handle(this);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

乍一看,这个例子看起来有点疯狂,但它并不像看上去那么不切实际。

这种方法的主要思想是责任链模式。您可以通过实施责任链模式在现实生活中重现此异常。例如,您有一些对象,每个对象在执行某些逻辑后都会调用链中的下一个对象,并将其工作结果传递给下一个对象。

您可以在 java 过滤器 ( javax.servlet.Filter )中看到这一点。我不知道该类工作的详细机制,但它使用 doFilter 方法调用链中的下一个过滤器,并且在所有过滤器/servlet 处理请求之后,它继续在 doFilter 下面的相同方法中工作。

换句话说,它在 servlet 之前以及向客户端发送响应之前拦截请求/响应。这是一段危险的代码,因为所有被调用的方法都位于同一线程的同一堆栈中。因此,如果链太大或者您在深层调用 doFilter 方法也提供了相同的情况,则可能会引发 stackoverflow 异常。也许,在调试过程中,您可能会在一个线程中看到调用链,这可能是堆栈溢出错误的原因。

此外,您还可以从下面的链接获取责任链模式示例,并添加元素集合而不是多个元素,您也会收到 stackoverflowerror。

与模式的链接:

https://www.journaldev.com/1617/chain-of-responsibility-design-pattern-in-java https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern

我希望这对你有帮助。