Почему intellij выводит «void» при использовании журнала оценки для точки останова? - PullRequest
0 голосов
/ 05 мая 2018

Я написал этот Java-код в intellij:

public class Main {
    public static void main(String[] args) {
        int[] a = {1,1,1,1,1,1};
        for(int i = 0; i < a.length; ++i) {
            a[i]++;
        }
    }
}

Затем я устанавливаю точку останова внутри цикла for следующим образом.

Breakpoint

Далее я перехожу в меню «Просмотр точек останова», в которое можно войти с помощью ctrl + shift + f8, и ввожу эти настройки для моей точки останова.

Breakpoint settings

Затем я нажимаю кнопку отладки, и мой вывод такой:

void
1
void
1
void
1
void
1
void
1
void
1

Почему intellij печатает "void" на выходе?

1 Ответ

0 голосов
/ 05 мая 2018

Это потому, что метод println() объявлен как void. Когда вы оцениваете выражение в режиме отладки, оно генерирует буквальное значение из результата выражения. Таким образом, когда вы оцениваете выражение System.out.println(a[i]), вы действительно указываете отладчику распечатать содержимое возвращаемого значения метода, которое оказывается void. Случается так, что внутри метода выполняется дополнительный вызов метода println(int), что делает фактическое вычисленное выражение по существу эквивалентным этому puedocode System.out.println(System.out.println(a[i])) (хотя, конечно, в действительности Java не воспринимает void как истинный тип, поэтому вы не сможете выполнить код, как написано).

JavaDoc для метода PrintStream.println(int) доступен здесь (для Java 9), и вы можете просмотреть исходный код метода здесь (из OpenJDK JDK версии 8u40-b25 он же Java 8).


Рассмотрим следующие методы:

void evaluatesToVoid(){
    final int[] a = {1,1};
    for(int i = 0; i < a.length; ++i) {
        System.out.println(a[i]);
    }

    return;
}

int evaluatesToSeven(){
     return 7;
}

Когда вы оцениваете вызов метода, который возвращает допустимый тип возврата, например, тип примитива int, вы получите возвращаемое значение метода.

При использовании оценки и входа в систему evaluatesToVoid() выведет это:

void
1
1

При использовании оценки и входа в систему evaluatesToSeven() напечатает это:

7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...