为什么在可以使用fn3外循环之前需要初始化fn3(变量)?

时间:2018-07-01 12:51:00

标签: java

程序运行正常。但是,如果未初始化fn3,而我尝试在循环外访问fn3,则编译器会抛出“ 变量fn3可能尚未初始化”。为什么应该声明和初始化fn3?

import java.util.Scanner;

class GenerateFibonacci {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);


System.out.println("Enter the limit of Fibonacci series: ");
        int limit = scan.nextInt();

        System.out.println("The first " + limit + "Fibonacci numbers are : ");

        int fn2=0, fn1=1, fn3=0;

        for(int i=0; i<=limit;i++) {
            if(i <= 1) {
                fn3 = i;
            }
            else {
                fn3 = fn2+fn1;
                fn2 = fn1;
                fn1 = fn3;  
            }

            System.out.println(fn3 + "\t");
        }

        System.out.println("The average is " + fn3/limit);
    }
}

2 个答案:

答案 0 :(得分:1)

局部变量必须在使用前初始化。它们没有默认值,并且包含垃圾数据,直到初始化。

实例和类变量不需要您初始化它们。声明这些变量后,它们将被赋予默认值。

答案 1 :(得分:0)

正如@anoopknr所说,必须在使用局部变量之前对其进行初始化。

但是,不仅仅如此。编译器必须知道在每次可能的执行中使用 之前,变量将被初始化。

在此版本的代码中:

    int fn2 = 0, fn1 = 1, fn3;

    for (int i = 0; i <= limit; i++) {
        if (i <= 1) {
            fn3 = i;
        }
        else {
            fn3 = fn2 + fn1;
            fn2 = fn1;
            fn1 = fn3;  
        }
        System.out.println(fn3 + "\t");
    }
    System.out.println("The average is " + (fn3 / limit));

...即使在每次循环迭代中都分配了println,也可以在不初始化fn3的情况下到达fn3。考虑limit为负的情况。然后0 <= limit将是false并且循环体将不被执行。如果未执行正文,则不会发生对fn3的赋值。

实际上,该要求比“必须初始化”要强。必须明确分配该变量。 JLS中有一个complete chapter来指定这意味着什么,但是在这种情况下,即使我们可以证明limit总是非负的,循环主体也不会执行确定的赋值。 / p>