我有两种方法都打印数组上的内容,一种声明为public void
,另一种声明为static void
。但是,当我从主程序类调用这些方法时,它们表现出不同的行为。
public void:
public void listStudent() {
for (int i = 0;i < 10;i++) {
if (studentNamesArray[i] != null) {
System.out.println(studentNamesArray[i]);
for(int y = 0;y < 3;y++) {
System.out.println(studentMarksArray[i][y]);
}
}
}
}
静态无效:
static void printArrays() {
for (int i = 0;i < 10;i++) {
if (studentNamesArray[i] != null) {
System.out.println(studentNamesArray[i]);
for(int y = 0;y < 3;y++) {
System.out.println(studentMarksArray[i][y]);
}
}
}
}
调用public void
会导致nullPointerEception
错误,而static void
调用不会打印任何内容(如预期的那样)。在这两种情况下,数组都是空的,但是如果我存储一个值然后删除该值,那么public void
方法就会按预期打印任何内容。即public void
,如果在创建对象之前调用它,则只会导致错误,即使该对象随后立即从数组中删除。
为什么这些方法的行为方式不同?声明方法static void
?
答案 0 :(得分:2)
检查您如何调用该方法。 对于非静态的公共方法,必须初始化对象。
举个例如这样的课程:
public class CustomObject
{
private static String[][] studentNamesArray = null;
public void listStudents() {...}
public static void printArrays() {...}
}
如果你打这个电话:
CustomObject.printArrays();
调用可以工作(并且不打印),因为该方法是静态的,因此在引用该CustomObject时总是存在。
如果你打这个电话:
CustomObject co;
co.listStudents();
它会因空指针异常而失败,因为CustomObject“co”尚未初始化。无法对null对象进行方法调用。
此外,必须初始化数组。如果没有周围的代码,很难说出程序中发生了什么,但是调用:
if( studentNamesArray[i] == null )
如果数组未初始化,将生成NPE。找不到空数组的第[i]个实例。对于方法的静态版本和本地版本都是如此。