2014-02-12 37 views
0

這是我的課arraylist在自行設計的類錯誤。請幫我

1 // This class reads in integers and puts the values into a set 
    2 
    3 import java.util.ArrayList; 
    4 import java.util.*; 
    5 
    6 class Set { 
    7 
    8  private ArrayList<Integer> members; 
    9  private static int quantity = 0; 
10 
11  // Constructors 
12  public Set() { 
13   new ArrayList<Integer>(); 
    7 
    8  private ArrayList<Integer> members; 
    9  private static int quantity = 0; 
10 
11  // Constructors 
12  public Set() { 
13   new ArrayList<Integer>(); 
14  } 
15 
16  public Set(int member){ 
17   new ArrayList<Integer>(); 
18   addMember(member); 
19   quantity++; 
20  } 
21  // Accessors 
22  public static int getQuantity() { 
23   return quantity; 
24  } 
25 
26  // Mutators 
27  public void addMember(int member) { 
28   members.add(member); 
29  } 
30  // toString() method 
31  public String toString() { 
32   int i; 
33   String str = "["; 
34   System.out.print("["); 
35   for(i=0; i<getQuantity(); i++){ 
36    str += members.get(i); 
37    if(i+1 == getQuantity()) 
38     str += "]"; 
39    else 
40     System.out.print(", "); 
41     str += ", "; 
42   } 
43   return str; 
44  } 
45 
46  // Return true if 'this' is a subset of 'set', 
47  // otherwise return false. 
48  public boolean isSubset(Set set) { 
49   if(this.members.contains(set)) 
50    return true; 
51   else 
52    return false; 
53  } 
54  // Return true if 'this' is equals to 'obj', 
55  // Otherwise return false 
56  public boolean equals(Set set) { 
57   return (members.contains(set) && set.members.contains(this)); 
58  } 
59 } 

這是我的測試案例。

1 // This program reads two sets of integers A and B, and determines 
    2 // if A is a subset of B, and if A is same as B. 
    3 
    4 import java.util.Scanner; 
    5 import java.util.ArrayList; 
    6 
    7 public class TestSet { 
    8 
    9  public static void main(String[] args) { 
10   Scanner sc = new Scanner(System.in); 
11   int i, setAnum, setBnum; 
12   
13   System.out.print("Enter number of elements in set A: "); 
14   setAnum = sc.nextInt(); 
15   ArrayList<Integer> list1 = new ArrayList<Integer>(); 
16   
17   System.out.print("Enter elements for set A: "); 
18   for(i=0; i<setAnum; i++)  
19    list1.add(sc.nextInt()); 
20    
21   Set setA = new Set(); 
22   for(i=0; i<setAnum; i++) 
23    setA.addMember(list1.get(i)); 
24    
25   System.out.print("Enter number of elements in set A: "); 
26   setBnum = sc.nextInt(); 
27   ArrayList<Integer> list2 = new ArrayList<Integer>(); 
28   
29   System.out.print("Enter elements for set A: "); 
30   for(i=0; i<setBnum; i++)  
31    list2.add(sc.nextInt()); 
32    
33   Set setB = new Set(); 
34   for(i=0; i<setAnum; i++) 
35    setB.addMember(list2.get(i)); 
36    
37   System.out.println("Set A: " + setA); 
38   System.out.println("Set B: " + setB); 
39   
40   if (setA.isSubset(setB)) { 
41    System.out.println("Set A is a subset of set B."); 
42   } 
43   else { 
44    System.out.println("Set A is not a subset of set B."); 
45   } 
46   if (setA.equals(setB)) 
47    System.out.println("Set A is equal to set B."); 
48   else 
49    System.out.println("Set A is not equal to set B."); 
50  } 
51 
52 } 

我不斷收到此錯誤

Exception in thread "main" java.lang.NullPointerException 
     at Set.addMember(Set.java:28) 
     at TestSet.main(TestSet.java:23) 

我可以讀取並查明問題出在哪裏,但我不知道要糾正一下。這是我第一次用一個ArrayList編寫一個用戶定義的類。以前我只用原始數據類型編寫類。所以我對許多東西感到困惑,比如什麼時候使用'this'引用,構造函數的訪問器和變形器應該是什麼樣子。有人回答,我推斷,如果我在這裏使用具有「成員」屬性的數組列表,我應該使用對「成員」的引用,而不是「this」,因爲這是我想要玩的屬性。我知道這並不是一條堅強而快速的規則,但我總是能夠拍出照片。請幫忙!!

+0

你應該避免「明星進口」。儘管技術上有效,但它們已被棄用。在你的特定情況下,你應該知道在'java.util'包中已經有一個名爲'Set'的Java接口。 –

+0

@MadPhysicist你有沒有可靠的消息來源說「開始導入」已被棄用?我不這麼認爲。至少eclipse並不會將它們標記爲已棄用。 –

+0

@RohitJain http://stackoverflow.com/questions/147454/why-is-using-a-wild-card-with-a-java-import-statement-bad –

回答

1

構造:

public Set() { 
    new ArrayList<Integer>(); 
} 

沒有做任何事情。它只是創建一個對象,並放棄它。所以members實例變量仍然是null。更改構造函數爲:

public Set() { 
    members = new ArrayList<Integer>(); 
} 

並請爲您的班級選擇一個不同的名稱。 Set已經是Java API中的一個接口。