Java - 无法初始化对象数组

时间:2015-11-04 13:35:45

标签: java arrays

我很长时间没有接触过Java,现在我正在努力初始化Array这个对象。每次它给出NullPointerException。

package RoomExpenses;

import java.util.Scanner;

我已将所有主要变量放在PSVM之外

public class ExpenseManager 
{
static int n=5;
static Person p[]=new Person[n];
static long average=0,total=0;

主要方法

public static void main(String[] args) 
{
  //  p=new Person[n];

    Scanner sc=new Scanner(System.in);
    initialize();

    System.out.println("Please enter details of all the "+n+" persons");
    for(int i=0;i<n;i++)
    {
        //p[i]=new Person();
        //It is not allowing me initialize here and giving error. 
        System.out.println("Details of Person No: "+(i+1));
        System.out.println("Enter name: ");
        p[i].Name=sc.nextLine();

        System.out.println("Enter expense done by "+p[i].Name);
        p[i].expense=sc.nextLong();

        p[i].id=i+1;
        p[i].balance=0;
    }

计算平均费用

    /*    Calculate Average Expense   */
    for(int i=0;i<n;i++)
    {
        total+=p[i].expense;
    }
    average=total/n;




    /*    Calculate Average Expense   */

计算每个人的平衡。积极意味着人应该从别人那里获得金钱。

否定意味着人应该向他人付钱

    /*    Calculate Balance*/
    for(int i=0;i<n;i++)
    {
        p[i].balance=p[i].expense-average;
    }
    /*    Calculate Balance*/

显示人员的详细信息。

    System.out.println("Details of all the persons.");
    System.out.println("Id\t\tName\t\tExpense\t\tBalance");
    for(int i=0;i<n;i++)
    {
        System.out.println(p[i].id+"\t\t"+p[i].Name+"\t\t"+p[i].expense+"\t\t"+p[i].balance);
    }







}

public static void initialize() 
{
    for(int i=0;i<n;i++)
    {
        p[i]=new Person(); 
    }
}

class Person
{
    String Name;
    int id;
    long expense,balance;

    Person()
    {
        Name="";
        id=0;
        expense=0;
        balance=0;

    }

}

1 个答案:

答案 0 :(得分:1)

你应该取消评论这一行:

for(int i=0;i<n;i++)
{
    //p[i]=new Person(); // un-comment this line
    System.out.println("Details of Person No: "+(i+1));
    System.out.println("Enter name: ");
    p[i].Name=sc.nextLine();
    ...

您必须在修改其成员之前创建Person实例。

评论此行时,p[i]null,因此p[i].Name会引发NullPointerException

编辑:

我刚注意到您的Person课程是ExpenseManager课程的内部课程。将其声明更改为static class Person,您将能够在没有封闭实例的情况下实例化它。

另一种方法是将其移到ExpenseManager班级之外。