1

我想在 setter 的帮助下在数组中输入一些名称......这是我的代码......你能帮我怎么做吗?预先感谢。

//这是带有输入语句的类myclass //我的问题是程序说线程“main”中的异常java.lang.NullPointerException //at studentproject.MyClass.AddList(MyClass.java:27) //at studentproject.Main。 main(Main.java:20) // Java Result: 1 //我的程序哪里有问题???

public class MyClass
{
     Student St = new Student();

     Student[]Array1 = new Student[10];
     Student[]ArrayF1 = new Student[10];

     void AddList()
     {

            Scanner Scan = new Scanner(System.in);

            for (int i=0; i<Array1.length & i<ArrayF1.length; i++)
            {
                System.out.println("Enter Student NAME Number " + (i+1) + ":");
                Array1[i].setName(Scan.next());


                //System.out.println("Enter Student MARK Number " + (i+1) + ":");
                //St.setMark(Scan.nextFloat());
            }

    }

}

// 这是我的学生类,所有的 setter 和 getter

public class Student
{
private String Name;
private float Mark;

/**
 * @return the Name
 */
public String getName() {
    return Name;
}

/**
 * @param Name the Name to set
 */
public void setName(String Name) {
    this.Name = Name;
}

/**
 * @return the Mark
 */
public float getMark() {
    return Mark;
}

/**
 * @param Mark the Mark to set
 */
public void setMark(float Mark) {
    this.Mark = Mark;
}

另一个问题是当我想打印数组时,打印数组的内存地址,而不是数组的值......我的问题在哪里......打印的内容是这样的......输入学生姓名编号 10:dddddd“studentproject .学生@1b67f74"

    void PrintList()
    {

            for (int i=0; i<Array1.length; i++)
            {

                System.out.println(Array1[i]);

            }
    }
4

4 回答 4

1
 Student[]Array1 = new Student[10];

填充Array110null个条目。

Array1[i].setName(Scan.next());

将调用which结果setName...nullNullPointerException

解决此问题的一种方法是:

1) Create new Student object inside for loop
2) call setName... on object created in step1
3) Set object to array index.
于 2012-12-28T21:05:37.317 回答
1

在 Java 中,数组是对象,因此当您编写时:

String[] asdf = new String[size];

您不会创建String存储在数组中的十个对象,而只会创建数组的对象,并将其所有元素(引用)设置为null.

你应该做的是Student在设置它的属性之前创建对象:

 Array1[i] = new Student();    
 Array1[i].setName(Scan.next());
于 2012-12-28T21:07:24.517 回答
1

不要忘记初始化数组的元素:

for (int i = 0; i < Array1.length; i++) {
    Array1[i] = new Student();
}

这一行:Student[] Array1 = new Student[10];创建一个空数组,其中包含空元素。在使用它们之前,您必须依次实例化每一个,否则NullPointerException当您尝试setName()在数组中的元素上调用方法(例如,)时,您会感到讨厌。

同样的考虑适用于ArrayF1。还有一个风格问题 - 在 Java 中,变量和方法名称以小写字符开头,只有类、接口和枚举名称以大写字符开头。

于 2012-12-28T21:08:13.033 回答
1
  Student[]Array1 = new Student[10];

实际上并没有给你 10 个正确构造Student的对象。它所做的是分配足够的空间来容纳 10 个正确构造的Student对象。因此,在它调用的数组的每次迭代中会发生什么null.setName。这导致了 NPE。

如果你想Student在分配后构造对象,你可以这样做:

for(int i = 0;i<Array1.length;i++)
{  
    Array1[i] = new Student();
}  

其他变量名称是小写的,除非它们是最终的,那么它们都是大写的。

于 2012-12-28T21:08:33.410 回答