2015-11-04 125 views
-2

我没有长时间与Java保持联系,现在我正在努力初始化Array对象。每次它给NullPointerException。Java - 无法初始化对象数组

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; 

    } 

} 
+0

总是发布*精确*堆栈跟踪/错误消息,并解释你的确切位置/时间,你遇到你的错误。理想情况下,如果您发布代码,编译并运行它来展示问题应该是微不足道的。以上内容不是这样,需要读者将您发布的代码拼凑在一起。虽然只是张贴链接不鼓励genral,*也*包括一个链接说http://pastebin.com/准备运行的代码将有助于在这种情况下,以节省不必要的努力。 –

+0

请避免将您的代码分成块以在其间写入文本。这使得难以看出这些块是否属于一起或者是否存在代码缺失。 – Tom

+0

对不起W.Prins /汤姆。这个网站不允许我发布更多的代码行。它要求我分裂它。 –

回答

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类之外。

+0

你好伊兰,是的,我初次尝试过。但它是给错误信息:“非静态vriables不能从静态内容引用”:( –

+0

行:p [i] =新人(); –

+0

现在问题已解决,谢谢大家的帮助。我为Person.Java创建了一个新文件。 –