Почему возникает ошибка StackOverflowError, когда код находится в операторе try и catch? - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь написать 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);
    }
}

А вот фрагмент из class 'Main':

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

Этот код работает нормально, но в основном классе, когда я передаю другой класс в объект CandleInterpreter вместо класса Output.class, a 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); ' в попытке поймать заявление. Кто-нибудь может объяснить? Спасибо.

-PrimeCubed

Ответы [ 3 ]

3 голосов
/ 04 апреля 2020

StackOverflowError - это ошибка, а не исключение. Поймать Exception не удастся поймать StackOverflowError.

Вы можете поймать его - либо как StackOverflowError, Error, либо Throwable - но чего, по вашему мнению, вы можете достичь тем самым? Error s предназначены для невосстановимых условий.

2 голосов
/ 04 апреля 2020

Я не читаю ваш код внимательно, но StackOverflowError - ошибка, а не исключение.

StackOverflowError extends VirtualMachineError

VirtualMachineError extends Error

Error extends Throwable

Покажите, в этом случае вы можете попробовать вместо этого бросить кошку. Для root причины вы должны посмотреть на стек вызовов и выяснить, как это может быть переполнение стека.

1 голос
/ 04 апреля 2020

Следующая строка вызывает исключение:

     output("Output class is invalid.");

Следовательно, код переходит в блок catch и пытается выполнить:

       output("Output class is invalid.");

Вместо этого, если вы замените свой код в блоке catch на ниже, оно не войдет в бесконечность l oop:

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