-3
public class HelloWorld{ //Why is it throwing error here
  final static int i;
     public static void main(String []args){
       int i = call(10);
       System.out.println("Hello World"+i);
     }
     static int call(int y){
         int r= y;
         return r ;
     }
}

对于上述程序,使用 final static int i;throws below 错误。谁能确切地告诉我为什么会这样。final static int i;在方法中声明时同样 有效。

错误:

$javac HelloWorld.java 2>&1
HelloWorld.java:1: error: variable i might not have been initialized
public class HelloWorld{
^
1 error
4

5 回答 5

4

您收到错误消息,因为这就是它应该表现的方式。

来自JLS - 第 8.3.1.2 节

如果声明它的类的静态初始化程序(第 8.7 节)未明确分配(第 16.8 节)一个空白 final(第 4.12.4 节)类变量,则这是编译时错误。

来自JLS - 第 16.8 节

令 C 为类,令 V 为 C 的空白静态最终成员字段,在 C 中声明。然后:

  • 在最左边的枚举常量、静态初始化器(第 8.7 节)或 C 的静态变量初始化器之前,V 肯定是未分配的(而且也不是肯定分配的)。

现在,由于您既没有静态初始化程序,也没有静态变量初始化程序,所以您的 final 字段肯定是未分配的。

您应该在声明时分配i一些值:

final static int i = 0;

或在一个static块中(这里不需要):

final static int i;
static { i = 0; }
于 2013-08-11T13:49:31.750 回答
2

final变量应至少初始化为默认值。

静态最终变量应该在类加载完成之前初始化。也就是说,您可以在声明时或在静态块中初始化它们。

所以你的最终变量应该像

 final static int i=0;//initialization at the time of declaration

或者

final static int i;

static{
  i=0;//initialization in static block
}
于 2013-08-11T13:50:03.320 回答
1

非静态变量也是如此。用 0 初始化它就可以了。

final static int i= 0;

但是,您对其进行阴影处理。你声明一个新的i并使用那个。你的决赛i根本不会被使用。

于 2013-08-11T13:51:15.323 回答
0

给我一些价值

final static int i = 0;

你也可能对此有兴趣

为什么必须在 Java 中始终初始化包括原语在内的局部变量?

于 2013-08-11T13:55:33.743 回答
0

你需要final static int i;用一些初始化int value

于 2013-08-11T13:58:25.727 回答