vscode: in "while ((inputLine = in.readLine ())! = null)" - l oop. x = x + a без предупреждения. Versus: x + = a "значение локальной переменной не используется" - PullRequest
1 голос
/ 11 июля 2020

Ниже приведен пример из https://docs.oracle.com/javase/tutorial/networking/urls/readingURL.html, единственное изменение состоит в том, что содержимое String inputLine добавляется в строку strAll вместо ее печати, см. X_HERE.

import java.net.*;
import java.io.*;

public class URLReader {
    public static void main(String[] args) throws Exception {

        URL oracle = new URL("http://www.oracle.com/");
        BufferedReader in = new BufferedReader(
        new InputStreamReader(oracle.openStream()));

        String inputLine;
        String strAll = "";
        while ((inputLine = in.readLine()) != null)
            // System.out.println(inputLine);
            strAll = strAll + inputLine; // X_HERE
        in.close();
    }
}

Это не выдает предупреждения. Если вы замените строку X_HERE на

strAll += inputLine;

с помощью «присваивания сложения», вы получите предупреждение:

Значение локальной переменной strAll не используется

Если вы замените условие while на (true), предупреждение для strAll исчезнет. Почему в этом контексте «дополнительное назначение» обрабатывается иначе?

Отредактировано благодаря @Joni: я использую код Visual Studio, предупреждение появляется в окне «Проблемы».

Ответы [ 2 ]

4 голосов
/ 11 июля 2020

Вот более простой, изолированный, экземпляр того же эффекта.

Оба этих варианта компилируются с одним и тем же байтовым кодом.

В этом примере

a += 1;

IDE видит, что a обновляется на 1, но не видит прямого использования a.

В этом примере

a = a + 1;

IDE видит a используется в выражении a + 1, а затем снова присваивается a, следовательно, с точки зрения IDE использовалось a.

Простое присвоение значения переменной не является использованием.

Обратите внимание, что это поведение unused также присутствует в Eclipse IDE, но при желании его можно отключить.

3 голосов
/ 12 июля 2020

Это предупреждение не является частью языка Java или даже компилятора Java. Это просто код Visual Studio, пытающийся быть полезным.

Это ошибка или ограничение в функции анализа кода stati c в vs code. Он считает strAll = strAll + inputLine как «использование» переменной strAll, но не считает эквивалент strAll += inputLine как «использование» переменной. Если бы анализ кода был более умным, он бы выдал предупреждение «неиспользуемая переменная» в обоих случаях.

...