2015-11-04 130 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創建了一個新文件。 –