[英]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
。
你可以捕捉到它——无论是StackOverflowError
、 Error
还是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.