以下代码无法编译,因为编译器无法保证数据字段 f
会被初始化。你如何解决这个问题?
导入java.util.Scanner;
public class Foo
{
private final int f;
/*constructor*/
public Foo()
{
Scanner sc = new Scanner(System.in);
for(int i = 0; i < 10; i++)
{
if(i == 5)
f = sc.nextInt();//error: variable f might be assigned in a loop
}
}
public Foo(int i)
{
j = i;//no problem
}
}
这不是语言中的小故障吗,因为在我的其他构造函数中,我可以将 f
设置为 final
并且只是因为它不是在循环中完成的作品。我知道编译器(愚蠢)看到一个循环并认为 f
将被重新分配,但程序中的逻辑确保它只发生一次。这是 Java 如何“保护”程序员的一个例子吗?
对于每个想知道为什么 f
被声明为 final 的人来说,Netbeans 建议它,大概是在代码有很大不同的时候。
最佳答案
private final int f;
↑
删除 final
关键字。编译器不知道 if
只会被满足一次,你会得到一个关于多次尝试更改 f
的错误:
The final field f may already have been assigned
关于java - 如何在循环内初始化数据字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21277250/