Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 变量可能未初始化,但出现错误_Java_Variables_Initialization - Fatal编程技术网

Java 变量可能未初始化,但出现错误

Java 变量可能未初始化,但出现错误,java,variables,initialization,Java,Variables,Initialization,当我试图编译此文件时: 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++ ; } ... } 在我看来,我在方法的顶部初始化了它们

当我试图编译此文件时:

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++ ;
    }

    ...

}

在我看来,我在方法的顶部初始化了它们。出什么问题了?

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

int a = 0;

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

int a = 0;
int b = 0;

至少这是C++,我假设java是同一个概念。

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

int a = 0;
int b = 0;

如果它们被声明为类的字段,那么它们实际上将被初始化为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

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

int a;        // This is a declaration
a = 0;        // This is an initialization
int b = 1;    // This is a declaration and initialization
出现错误是因为尚未初始化变量,但在
for
循环中增加了变量(例如,
a++

Java原语有默认值,但正如下面一位用户所评论的那样

当声明为类成员时,它们的默认值为零。局部变量没有默认值


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

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

您声明了它们,但没有为它们提供初始值-因此,它们是未初始化的。尝试以下方法:

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

警告应该消失。

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

局部变量不获取默认值。它们的初始值是未定义的,没有通过某种方式指定值。在使用局部变量之前,必须对它们进行初始化

int a; // declaration, unknown value
a = 0; // initialization
int a = 0; // declaration with initialization
当您在类级别(作为成员,即作为字段)和方法级别声明变量时,会有很大的不同

如果在类级别声明字段,它们将根据其类型获得默认值。如果在方法级别或作为块(表示{}内的任何代码)声明变量,则不获取任何值并保持未定义状态,直到它们以某种方式获取一些起始值,即分配给它们的一些值。

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

a=0;
声明和初始化都是不同的


祝你好运

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

  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);
  }

由于没有其他答案引用Java语言标准,我决定自己写一个答案:

在Java中,默认情况下,局部变量不是用某个值初始化的(例如,与类字段不同)。从语言规范中,one()可以读取以下内容:

局部变量(§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++无法生成任何有意义的结果与编译器显示错误的原因无关。而是因为它是在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;
    }

    ...   
}
publicstaticrandsearchcount(int[]x)
{
如果(x==null | | x.length==0)
返回null;
INTA;
int b;
...   

for(intl=0;lPerhaps“intb=0;”是“声明和初始化”对于将来的访问者…还可以查看潜在未初始化变量何时为类成员。有人能解释一下这是怎么可能的,因为原语不能有空值,它们的默认值是0,为什么它会显示未初始化错误?@SrujanBarai当声明为类成员时,它们的默认值是零。局部变量没有定义AutoValue.如果A是一个通用的,那不是真的.初始化是声明语法的可选部分.静态成员可能以其他方式得到默认值.你不能从C++中导出它. java中的局部变量不会自动得到默认值(但是如果java的设计不同,可能会有),但实例和类变量(“static”)会获得默认值。
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;
    }

    ...   
}