数组变量可能没有初始化错误

时间:2014-04-14 16:04:29

标签: java arrays initialization syntax-error

我创建了类Supervisor,其中包含构造函数和toString方法。但是,当我尝试打印数组的索引时发生错误,“变量svArray可能尚未初始化。 我该怎么做才能解决这个问题?

Supervisor[] svArray;
if (mainChoice == 3){
        String ID, name, department, resarch;
        System.out.println("Enter How Many Supervisor you want to enter : ");
        svNumber = input.nextInt();
        svArray = new Supervisor[svNumber];
        for (int i = 0; i < svNumber; i++) {
            System.out.println("---Enter Supervisor " + (i + 1) + " Of " + svNumber + " ---");
            System.out.println("Enter staff ID : ");
            ID = input.next();
            System.out.println("Enter name : ");
            name = input.next();
            System.out.println("Enter department : ");
            department = input.next();
            svArray[i]=new Supervisor(ID, name, department);\
        }


    }
System.out.print(svArray[1].toString)
//Error, variable svArray might not have been initialized

5 个答案:

答案 0 :(得分:3)

问题在于这一行:

System.out.print(svArray[1].toString)
svArray的情况下,

mainChoice != 3尚未初始化,因为您初始化了未执行的if语句内的数组。

要解决此问题,您可以将数组初始化为null

Supervisor[] svArray = null;

然后检查null

if(svArray != null) System.out.print(svArray[1].toString());

答案 1 :(得分:2)

只需将数组初始化在if语句中,但在外部使用它。因此,如果if语句的内容永远不会运行(即每当mainChoice不是3时),则在最后使用该数组而不进行初始化。

答案 2 :(得分:1)

如果mainChoice不等于3,则svArray永远不会被初始化。您需要将print语句放入if块或无条件地将svArray [1]初始化为某个值。

答案 3 :(得分:0)

本地变量与成员变量的不同之处在于,会自动初始化为默认值。 Java不允许您使用尚未初始化的变量,并且JVM无法知道mainChoice是否始终为3。因此,编译器无法确定在尝试调用System.out.print(svArray[1].toString)时您的数组是否已初始化 - 因此您的错误。

不清楚为什么你在循环之外声明svArray,所以这段代码可能不完全合适:

if (mainChoice == 3){
    String ID, name, department, resarch;
    System.out.println("Enter How Many Supervisor you want to enter : ");
    svNumber = input.nextInt();
    Supervisor[] svArray = new Supervisor[svNumber];
    for (int i = 0; i < svNumber; i++) {
        System.out.println("---Enter Supervisor " + (i + 1) + " Of " 
            + svNumber + " ---");
        System.out.println("Enter staff ID : ");
        ID = input.next();
        System.out.println("Enter name : ");
        name = input.next();
        System.out.println("Enter department : ");
        department = input.next();
        svArray[i]=new Supervisor(ID, name, department);\
    }
    System.out.print(svArray[1].toString())
}

这里有三个重要的变化。

  • svArray声明和初始化现在出现在if声明的同一行。
  • System.out.println调用现在也发生在if声明中,因此svArray仍然在范围内。
  • 现在可以正确调用toString() 方法,而不是尝试访问名为toString的属性(不存在)。

答案 4 :(得分:0)

 svArray[i]=new Supervisor(ID, name, department);

您在if语句中初始化了上面的数组。所以,当你说:System.out.print(svArray[1].toString) Java不知道你在if语句中初始化它。块{}内的任何内容都具有仅在该特定块段内有效的范围,如果该块不是类类型。假设您在类块中定义了某些内容,那么您将不会在类块中使用您的变量或声明。但是,如果你使用ArrayList,那么你可能不需要初始化它的大小,所以只是简单地声明类块中的ArrayList将允许你在其他方法/语句中使用它/初始化它。