gpt4 book ai didi

java - javac数据流分析的诡异误报

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:14:28 26 4
gpt4 key购买 nike

我有以下形式的代码:

class Test {
private final A t;

public Test() {

for ( ... : ... ) {
final A u = null;
}

t = new A();
}

private class A {}
}

编译器说:

variable t might already have been assigned

有趣的是,如果我对循环执行以下任何更改,它就会成功!

  • 将循环的内容更改为 A u = null
  • 删除循环(但保留 final A u = null; )
  • 用经典的计数循环替换 foreach 式循环

这是怎么回事?

注意:我无法找到导致错误的最小示例,因此“环境”(大约 1400 loc)可能有问题。我看不出有什么会干扰 t 的初始化, 虽然, 作为 t没有写到其他地方。

有趣的事实:如果我删除它,IntelliJ IDEA 会说“变量‘u’可以有‘final’修饰符...”。

我使用 javac 1.6.0_26。

更新:好了,这个例子最小化了:

import java.util.List;

class A {
private final boolean a;

public A() {
for ( final Object o : new Object[] {} ) {
final Object sh = null;
}

a = true;
}

class B {
private final Object b1;
private final Object b2;

B() {
b1 = null;
b2 = null;
}
}
}

无法在 javac 1.6.0_26 上编译但在 javac 1.7.0_02 上编译.所以我想我遇到了一些邪恶的角落案例……什么?

请注意,您可以执行以下任何操作

  • 删除任何一个成员
  • 删除 finalA() 的循环内
  • 用正常的 for 替换循环循环,例如for ( int i=0; i<100; i++ ) { ... }

它会编译。

最佳答案

如果你有很多代码,我会试试这个。

private final A t;

public Test() {
final int t = 1;

for ( ... ) {
final A u = null;
}

this.t = new A();

这将导致任何“可能”初始化 t 的代码失败(并出现在编译器中。

关于java - javac数据流分析的诡异误报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9112927/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com