我创建了类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
答案 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将允许你在其他方法/语句中使用它/初始化它。