繁体   English   中英

当代码在 try and catch 语句中时,为什么会抛出 StackOverflowError?

[英]Why is a StackOverflowError being thrown, when the code is in a try and catch statement?

我正在尝试为我自己创建的语言的解释器编写 API,到目前为止我有三个类:

这是 class 'CandleInterpreter' (主要 API 类)的片段:

protected Class<?> inputClass;
protected Class<?> outputClass;
public String input;
protected String currentFile;

public CandleInterpreter(Class<?> inputClass, Class<?> outputClass) {
    this.inputClass = inputClass;
    this.outputClass = outputClass;
    this.input = "";
    this.currentFile = "";
}

这个 class 包含这个方法:

public void output(String message) {
    try {
        outputClass.getConstructor(String.class).newInstance(message);
    } catch (Exception exception) {
        output("Output class is invalid.");
        System.exit(0);
    }
}

这是 class '输出'的片段:

public class Output {
    public Output(String message) {
        System.out.println(message);
    }
}

这是 class 'Main' 的片段:

public static void main(String args[]) {
    CandleInterpreter interpreter = new CandleInterpreter(Input.class, Output.class);
    interpreter.output("Hello World!");
}

This code works fine, but in the main class, when I pass a different class into the 'CandleInterpreter' object, instead of the 'Output.class' class, a 'StackOverflowError' is thrown:

Exception in thread "main" java.lang.StackOverflowError
at java.base/java.lang.StringUTF16.compress(StringUTF16.java:158)
at java.base/java.lang.String.<init>(String.java:3002)
at java.base/java.lang.String.<init>(String.java:250)
at java.base/java.util.StringJoiner.toString(StringJoiner.java:187)
at java.base/java.lang.Class.methodToString(Class.java:3374)
at java.base/java.lang.Class.getConstructor0(Class.java:3302)
at java.base/java.lang.Class.getConstructor(Class.java:2110)
at CandleAPI.CandleInterpreter.output(CandleInterpreter.java:107)
at CandleAPI.CandleInterpreter.output(CandleInterpreter.java:109)
at CandleAPI.CandleInterpreter.output(CandleInterpreter.java:109)
at CandleAPI.CandleInterpreter.output(CandleInterpreter.java:109)
at CandleAPI.CandleInterpreter.output(CandleInterpreter.java:109)
at CandleAPI.CandleInterpreter.output(CandleInterpreter.java:109)
at CandleAPI.CandleInterpreter.output(CandleInterpreter.java:109)
at CandleAPI.CandleInterpreter.output(CandleInterpreter.java:109)
at CandleAPI.CandleInterpreter.output(CandleInterpreter.java:109)
at CandleAPI.CandleInterpreter.output(CandleInterpreter.java:109)
at CandleAPI.CandleInterpreter.output(CandleInterpreter.java:109)
...

我很困惑为什么会抛出这个错误,因为我有代码行'outputClass.getConstructor(String.class).newInstance(message);' 在 try and catch 语句中。 谁能解释一下? 谢谢。

-PrimeCubed

StackOverflowError 是错误,而不是异常。 捕获Exception不会捕获StackOverflowError

可以捕捉到它——无论是StackOverflowErrorError还是Throwable但你认为这样做可以实现什么? Error意味着不可恢复的条件。

我没有仔细阅读您的代码,但 StackOverflowError 是错误而不是异常。

StackOverflowError extends VirtualMachineError

VirtualMachineError extends Error

Error extends Throwable

在这种情况下,您可以尝试 cat a Throwable 代替。 对于根本原因,您应该查看调用堆栈并弄清楚它是如何发生堆栈溢出的。

以下行引发异常:

     output("Output class is invalid.");

因此代码进入 catch 块并尝试执行:

       output("Output class is invalid.");

相反,如果您将 catch 块中的代码替换为下面,它将不会进入无限循环:

        System.out.println("Output class is invalid.);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM