java - 如何在循环内初始化数据字段?

标签 java oop

以下代码无法编译,因为编译器无法保证数据字段 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/

相关文章:

java - 特定单词之前的单词数

php - 加载php类的性能和 'extends'的使用

php - 什么是领域对象以及它的用途是什么?

javascript - 如何将函数放入对象中并直接输出结果

java - 无法从 WebFilter 发送 json 响应

java - 从java更改命令的工作目录

java - 使用kura框架,连接BLE设备时如何指定地址类型为 "random static"

Java 正则表达式 - 删除引号,除非前面有奇数个反斜杠

java - ArrayList 重用单个对象,而不是创建新对象

java - 我们应该@Override 接口(interface)的方法实现吗?