代码之家  ›  专栏  ›  技术社区  ›  questionto42

在“while((inputLine=In.readLine())!=null)“-循环。x=x+a,无警告。vs:x+=一个“未使用局部变量的值”。为什么?

  •  0
  • questionto42  · 技术社区  · 6 年前

    https://docs.oracle.com/javase/tutorial/networking/urls/readingURL.html ,唯一的更改是将字符串inputLine的内容添加到strAll字符串中,而不是打印它,请参见此处的X_。

    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_行替换为

    strAll += inputLine;
    

    不使用局部变量strAll的值

    编辑感谢@Joni:I使用Visual Studio代码,警告显示在“问题”窗口中。

    0 回复  |  直到 6 年前
        1
  •  3
  •   Joni    6 年前

    此警告不是Java语言的一部分,甚至不是Java编译器的一部分。这只是VisualStudio代码试图提供帮助。

    这是vs代码中静态代码分析功能的一个缺陷或限制。正在计数 strAll = strAll + inputLine 作为变量的“使用” strAll strAll += inputLine 作为变量的“使用”。如果代码分析更智能,它将为这两种情况提供“未使用的变量”警告。

        2
  •  3
  •   WJS    6 年前

    这两种变体编译为相同的字节码。

    在这个例子中,

    a += 1;
    

    IDE可以看到 a 正在由1更新,但未看到的直接用法 .

    在这个例子中,

    a = a + 1;
    

    IDE可以看到 A. a + 1 然后分配回 因此,从IDE的角度来看, A.

    请注意 unused Eclipse IDE

        3
  •  1
  •   Stephan Herrmann    5 年前

    为了完整起见,以下是我的答案 github issue :

    strAll += inputLine strAll

    strAll = strAll + inputLine 然而,这只是众多形式中的一种,人类读者很容易就能看到 真的流不到哪里。

    虽然在我参加Eclipse之前就做出了区别对待这两种形式的决定,但我非常确信,团队认为这是在ecj可以推理的事情和过于复杂的事情之间划出的最清晰的界限。扩展流量分析时需要讨论的一些示例:

    • strAll = "foo" + strAll + "bar";
    • strAll = (bar = strAll) + "foo";
    • strAll = convert(strAll);
    • 等等,pp。

    关于 while (true) ,我认为(不仔细看),当流分析发现一个方法无法正常完成时,它会立即停止。

    推荐文章