java - 当代码在 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
解决方案
StackOverflowError 是错误,而不是异常。捕捉Exception
不会捕捉到StackOverflowError
.
你可以捕捉到它 - 或者StackOverflowError
-Error
或者Throwable
- 但是你认为这样做可以实现什么?Error
s 意味着不可恢复的条件。
推荐阅读
- laravel-5.8 - 如何使用带有 id 的会话?
- ios - 如何在iOS中创建从全色到不透明度为0的渐变?
- mysql - 从 shell 脚本将表导出为 mysql 中的 csv
- html - 设置 flex 值以在容器宽度较小时使标签正确显示?
- c# - C# tcpclient 没有写入套接字......或者我没有阅读所有的响应?
- excel - 如何使用 Excel VBA 有条件地添加和删除表中的某些行
- machine-learning - 类的混淆矩阵子集无法正常工作
- arrays - 如何创建由程序集中的寄存器定义的大小的初始化数组?
- python - 某个呼叫类别的第一次呼叫与同一呼叫类别的后续呼叫之间的调查分数差异
- javascript - 求解未知指数