程序运行正常。但是,如果未初始化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);
}
}
答案 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>