Почему мой java-метод извиняет строки после оператора return? - PullRequest
0 голосов
/ 09 мая 2019

Я следую учебному пособию по синтаксическому анализу XML в Java (ThinMatrix's. Youtube) и пытаюсь понять, как работает код, шагая через него.

    private static XmlNode loadNode(BufferedReader reader) throws Exception {
        String line = reader.readLine().trim();
        if (line.startsWith("</")) {
            return null;
        }
        String[] startTagParts = getStartTag(line).split(" ");
        XmlNode node = new XmlNode(startTagParts[0].replace("/", ""));
        addAttributes(startTagParts, node);
        addData(line, node);
        if (CLOSED.matcher(line).find()) {
            return node;
        }
        XmlNode child = null;
        while ((child = loadNode(reader)) != null) {
            node.addChild(child);
        }
        return node;
    }

В этом блоке впервыечто первый «if-оператор» выполняется - т.е. когда синтаксический анализатор впервые читает закрывающий тег - выполняется строка «return null», а затем программа переходит к оператору while в нижней части метода.Я не видел такого поведения раньше - почему программа не выходит из метода после оператора return null.

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Я чувствую, что ваш перерыв в отладке на "return null"; строка вместо оператора IF над ним, так что вы фактически не разбиваете на первой итерации. Это означает, что когда он возвращает ноль, отладчик возвращается к строке кода, которая вызвала тот экземпляр метода, который был бы строкой WHILE.

Вы можете проверить это, если что-то есть в "узле" или изменив точку останова отладчиков на самую первую строку этого метода.

0 голосов
/ 09 мая 2019

почему программа не выходит из метода после оператора return null?

Метод завершается после оператора return null.Это отличается от программы выхода.Как правило, в рекурсивных методах одновременно выполняется несколько «копий» одного и того же метода (как бы внутри друг друга).Итак, один из внутренних вызовов функции loadNode() завершается в операторе return null;, и этот вызов loadNode() был сделан из "внешнего" вызова метода в операторе while((child = loadNode(reader)) != null).

Рекурсия может быть немного хитрой:)

...