首页 > 解决方案 > 当代码在 try and catch 语句中时,为什么会抛出 StackOverflowError?

问题描述

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

这是来自“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 = "";
}

这个类包含这个方法:

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

这是“输出”类的一个片段:

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

这是“Main”类的一个片段:

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

此代码工作正常,但在主类中,当我将不同的类传递给“CandleInterpreter”对象时,而不是“Output.class”类,会引发“StackOverflowError”:

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

标签: javaapiexceptiontry-catch

解决方案


StackOverflowError 是错误,而不是异常。捕捉Exception不会捕捉到StackOverflowError.

可以捕捉到它 - 或者StackOverflowError-Error或者Throwable- 但是你认为这样做可以实现什么?Errors 意味着不可恢复的条件。


推荐阅读