变量可能未初始化错误

ibrsph3r  于 2021-06-30  发布在  Java
关注(0)|答案(12)|浏览(445)

当我试图编译时:

public static Rand searchCount (int[] x)
{
    int a ;
    int b ;

    ...

    for (int l= 0; l<x.length; l++)
    {
        if (x[l] == 0)
        a++ ;
        else if (x[l] == 1)
        b++ ;
    }

    ...

}

我得到这些错误:

Rand.java:72: variable a might not have been initialized
                a++ ;
                ^
Rand.java:74: variable b might not have been initialized
                b++ ;
                ^
2 errors

在我看来,我在方法的顶部初始化了它们。怎么了?

30byixjq

30byixjq1#

如果它们被声明为类的字段,那么它们将被初始化为0。
你有点困惑,因为如果你写:

class Clazz {
  int a;
  int b;

  Clazz () {
     super ();
     b = 0;
  }

  public void printA () {
     sout (a + b);
  }

  public static void main (String[] args) {
     new Clazz ().printA ();
  }
}

然后此代码将打印“0”。这是因为在创建clazz的新示例时会调用一个特殊的构造函数。起初 super () 将被调用,然后字段 a 将隐式初始化,然后 b = 0 将被执行。

yhqotfr8

yhqotfr82#

将变量“a”设置为如下值,

a=0;

声明和初始化都是不同的。
祝你好运

sauutmhj

sauutmhj3#

在使用方法块之前,初始化方法块中的局部变量是一种很好的做法。这是初学者可能犯的一个错误。

public static void main(String[] args){
    int a;
    int[] arr = {1,2,3,4,5};
    for(int i=0; i<arr.length; i++){
        a = arr[i];
    }
    System.out.println(a);
  }

您可能希望控制台将显示“5”,但编译器将抛出“variable a may not be initialized”错误。尽管有人可能认为变量a在for循环中是“初始化的”,但编译器不会这样想。如果…怎么办 arr.length 是0吗?for循环根本不会运行。因此,编译器将给出 variable a might not have been initialized 指出潜在的危险并要求您初始化变量。
为了防止这种错误,只需在声明变量时初始化它。

int a = 0;
vc6uscn9

vc6uscn94#

由于没有其他答案引用java语言标准,我决定自己写一个答案:
在java中,默认情况下,局部变量不是用某个值初始化的(例如,与类的字段不同)。从语言规范一(§4.12.5)可以阅读以下内容:
局部变量(§14.4, §14.14)必须在使用之前通过初始化或(§14.4)或转让(§15.26),以可使用明确分配规则验证的方式(§16(明确分配)。
因此,由于变量 a 以及 b 未初始化:

for (int l= 0; l<x.length; l++) 
    {
        if (x[l] == 0) 
        a++ ;
        else if (x[l] == 1) 
        b++ ;
    }

操作 a++; 以及 b++; 无论如何,无法产生任何有意义的结果。因此,编译器通知您这一点是合乎逻辑的:

Rand.java:72: variable a might not have been initialized
                a++ ;
                ^
Rand.java:74: variable b might not have been initialized
                b++ ;
                ^

然而,我们需要明白 a++; 以及 b++; 无法生成任何有意义的结果与编译器显示错误的原因无关。而是因为它是在java语言规范上显式设置的
局部变量(§14.4, §14.14)必须显式给定一个值(…)
为了展示上述观点,让我们将您的代码更改为:

public static Rand searchCount (int[] x) 
{
    if(x == null || x.length  == 0)
      return null;
    int a ; 
    int b ; 

    ...   

    for (int l= 0; l<x.length; l++) 
    {
        if(l == 0)
           a = l;
        if(l == 1)
           b = l;
    }

    ...   
}

因此,即使上面的代码可以被正式证明是有效的(即变量 a 以及 b 将始终指定值 0 以及 1 编译器的工作不是试图分析应用程序的逻辑,局部变量初始化规则也不依赖于此。编译器检查变量 a 以及 b 根据局部变量初始化规则初始化,并作出相应React(例如,显示编译错误)。

uurity8g

uurity8g5#

你还没有初始化 a 以及 b ,只声明了它们。有一个微妙的区别。

int a = 0;
int b = 0;

至少对于c++,我认为java是相同的概念。

nr9pn0ug

nr9pn0ug6#

您声明了它们,但没有用值初始化它们。添加如下内容:

int a = 0;
hjzp0vay

hjzp0vay7#

局部变量不获取默认值。它们的初始值是未定义的,没有通过某种方式赋值。在使用局部变量之前,必须对它们进行初始化。
当您在类级别(作为成员,即作为字段)和方法级别声明变量时,会有很大的区别。
如果在类级别声明字段,它们将根据类型获得默认值。如果在方法级或作为块(表示{}中的任何代码)声明变量,则不要获取任何值并保持未定义状态,直到它们以某种方式获取一些起始值(即分配给它们的一些值)。

ctehm74n

ctehm74n8#

你声明了它们,但没有初始化它们。初始化它们就是将它们设置为一个值:

int a;        // This is a declaration
a = 0;        // This is an initialization
int b = 1;    // This is a declaration and initialization

你得到错误是因为你没有初始化变量,但是你增加了它们(例如。, a++ )在 for 循环。
java原语有默认值,但正如一位用户在下面评论的那样
当声明为类成员时,它们的默认值为零。局部变量没有默认值

jutyujz0

jutyujz09#

您声明了它们,但没有初始化。

int a; // declaration, unknown value
a = 0; // initialization
int a = 0; // declaration with initialization
62lalag4

62lalag410#

您在方法开始时声明了它们,但从未初始化它们。初始化是将它们设置为一个值,例如:

int a = 0;
int b = 0;
wswtfjt7

wswtfjt711#

您声明了它们,但没有为它们提供初始值—因此,它们未初始化。尝试以下操作:

public static Rand searchCount (int[] x)  
{ 
  int a = 0 ;  
  int b = 0 ;

警告应该消失。

m0rkklqb

m0rkklqb12#

想象一下如果x[l]在循环中既不是0也不是1会发生什么。在这种情况下,a和b将永远不会被赋值,并且具有未定义的值。必须用某个值初始化它们,例如0。

相关问题