2013-04-18 33 views
1

我試過搜索,但還沒有找到任何可以幫助我的東西。所以這裏去:嘗試將兩個ArrayList對象鏈接在一起

我試圖通過他們的customerID連接到客戶卡,我似乎無法得到它正常工作(NullPointerExceptions)。這些對象將放入ArrayLists中。

我很確定問題出在LiftCard()的toString()中。

import java.io.Serializable; 

public class LiftCard implements Serializable { 
private int cardNumber, cardType, cardPrice, cardPassing; 
int cardBalance; 
private User user; 
LiftCard next; 

public LiftCard(int cT, int cN) { 
    cardNumber = cN; 
    cardType = cT; 
    next = null; 

}// end of konstruktQr 

public int getCardNumber() { 
    return cardNumber; 
} 

public int getCardType() { 
    return cardType; 
} 

public User getUser(){ 
    return user; 
} 

public void setUser(User u){ 
    user = u; 
} 

public String toString() { 
    return getUser().getCustomerID() + "\t" + cardNumber + "\t" + cardType; 
//Pretty sure the problem is here! 
} 

這是用戶級的,我想鏈接到的卡類

import java.io.Serializable; 

public class User implements Serializable { 
private String surename, firstName, phone, adress, birth; 
private int customerID; 
public LiftCard liftCard; 
User next; 

public User(int cID, String fN, String sn, String p, String a, String b) { 
    firstName = fN; 
    surename = sn; 
    phone = p; 
    adress = a; 
    birth = b; 
    customerID = cID; 
    liftCard = null; 
    next = null; 
} 

public String getSurename() { 
    return surename; 
} 

public String getFirstName() { 
    return firstName; 
} 

public String getPhone() { 
    return phone; 
} 

public String getAdress(){ 
    return adress; 
} 

public String getBirth() { 
    return birth; 
} 

public int getCustomerID() { 
    return customerID; 
} 

public LiftCard getLiftCard(){ 
    return liftCard; 
} 

public void setLiftCard(LiftCard liftC){ 
    liftCard = liftC; 
} 

public String toString() { 
    return customerID + "\t" + surename + "\t" + firstName + "\t" + phone 
      + "\t" + adress + "\t" + birth; 

} 

public boolean equals(User u) { 
    return (u.getSurename().equals(surename) && u.getFirstName().equals(
      firstName)); 
} 
} 

這裏就是我試圖將它們綁定在一起:

public void regLiftCard() { 
    int cardtype = Integer.parseInt(cardTypeField.getText()); 
    int cardnumber = Integer.parseInt(cardNumberField.getText()); 
    int customerID = Integer.parseInt(findCustomerField.getText()); 

    if (cardtype != 1 && cardtype != 2 && cardtype != 3) { 
     JOptionPane.showMessageDialog(this, "Kortet må være 1,2 eller 3!"); 
     return; 
    } 
    try { 
     String firstName = firstNameField.getText(); 
     String surename = surenameField.getText(); 
     String phone = phoneField.getText(); 
     String adress = adressField.getText(); 
     String birth = birthField.getText(); 

     User u = userA.findById(customerID); 
     LiftCard l = new LiftCard(cardnumber, cardtype); 
     if (u != null) { 
      if (u.getLiftCard() != null) { 
       JOptionPane.showMessageDialog(this, 
         "Brukeren har allerede kort!"); 
      } else 
       cardA.regLiftCard(l); 
      JOptionPane.showMessageDialog(this, "1Kort registrert!"); 
      return; 
     } else 
      u = new User(customerID++, firstName, surename, phone, adress, 
        birth); 
     JOptionPane.showMessageDialog(this, "Bruker registrert!"); 
     cardTypeField.setText(""); 
    } catch (NumberFormatException e) { 
     JOptionPane.showMessageDialog(this, "Feil i nummerformat!"); 
    } 

} 

這裏是兩個歸檔類中的第一個。首先是卡片。

import java.util.*; 
import java.io.*; 

import javax.swing.JOptionPane; 

public class CardArchive implements Serializable { 
ArrayList<LiftCard> clist = new ArrayList<LiftCard>(); 

// Setter inn nytt LiftCard-objekt bakerst i lista 
public void regLiftCard(LiftCard c) { 
    clist.add(c); 
} 

public String toString() { 
    String cards = ""; 
    Iterator<LiftCard> iterator = clist.iterator(); 

    while (iterator.hasNext()) { 
     cards += iterator.next().toString() + "\n"; 
    } 
    return cards; 
} 

public LiftCard findByCardNumber(int id) { 
    for (LiftCard c : clist) { 
     if (c.getCardNumber() == id) { 
      return c; 
     } 
    } 
    return null; // or empty Card 
} 


} 

而第二個是用戶歸檔:

import java.util.*; 
import java.io.*; 
import javax.swing.JOptionPane; 

public class UserArchive implements Serializable { 
ArrayList<User> list = new ArrayList<User>(); 
private static int idCounter = 1000; 

// Setter inn nytt User-objekt bakerst i lista 
public void regCustomer(User u) { 
    list.add(u); 
} 

// Sorterer User-objektene alfabetisk på surename og first name 
public void sorter() { 
    Collections.sort(list, new UserComp()); 
} 

public User findById(int id) { 
    for (User u : list) { 
     if (u.getCustomerID() == id) { 
      return u; 
     } 
    } 
    return null; // or empty User 
} 

public String toString() { 
    sorter(); 
    String users = ""; 
    Iterator<User> iterator = list.iterator(); 

    while (iterator.hasNext()) { 
     users += iterator.next().toString() + "\n"; 
    } 
    return users; 
} 

} 

正如你很可能會看到,只要看看一些代碼,我在java的非常新。但是儘量少嘗試。感謝任何和所有幫助提前!

編輯:

同時使用馬洛尼和bmorris591答案的組合! 代碼我改變如下:

User u = userA.findById(customerID); 
     LiftCard l = new LiftCard(cardnumber, cardtype); 
     if (u != null) { 
      if (u.getLiftCard() != null) { 
       JOptionPane.showMessageDialog(this, 
         "Brukeren har allerede kort!"); 
      } else 
       l.setUser(u); 
       cardA.regLiftCard(l); 

和:

public String toString() { 
    if (getUser() != null){ 
     return getUser().getCustomerID() + "\t" + getUser().getSurename() + "\t" + cardNumber + "\t" + cardType; 
    } else { 
     return null; 
    } 
} 

感謝您的幫助傢伙!

+0

相關問題:http://stackoverflow.com/questions/12688068/how-to-read-and-understand-the-java-stack-trace –

+0

很顯然,我們不能幫你。 ..因爲你的問題中沒有包含堆棧跟蹤。 –

回答

0

從你的代碼,它看起來像你正在使用從LiftCarduser場在其toString方法:

public String toString() { 
    return getUser().getCustomerID() //etc 

但是當你創建LiftCard我沒有看到你註冊之前設置user的任何地方:

LiftCard l = new LiftCard(cardnumber, cardtype); 
     if (u != null) { 
      if (u.getLiftCard() != null) { 
       JOptionPane.showMessageDialog(this, 
         "Brukeren har allerede kort!"); 
      } else 
       cardA.regLiftCard(l); //etc 

你在某些時候調用l.setUser(u)否則user字段中LiftCard需要是null

LiftCard l = new LiftCard(cardnumber, cardtype); 
     if (u != null) { 
      if (u.getLiftCard() != null) { 
       JOptionPane.showMessageDialog(this, 
         "Brukeren har allerede kort!"); 
      } else 
       l.setUser(u); // <-- here we set the `User` on the `LiftCard`. 
       cardA.regLiftCard(l); //etc 
+0

感謝您的幫助!現在就開始工作了。對不起,沒有發佈堆棧跟蹤。 – mathletics

0

嘗試:

public String toString() { 
    return (getUser() == null ? null : getUser().getCustomerID()) + "\t" + cardNumber + "\t" + cardType; 
} 
0

你不初始化user對象在LiftCard類。您可以在構造函數中執行此操作,或者在致電getUser()之前調用setUser(user)方法,並且應該將問題排除。

你也可以把一個空檢查周圍的代碼部分:

public String toString() { 
    if (getUser() != null){ 
     return getUser().getCustomerID() + "\t" + cardNumber + "\t" + cardType; 
    } else { 
     return null; 
    } 
} 

這將停止拋出異常,但你仍然需要,如果你想你的代碼正常工作初始化用戶。

+0

感謝您的幫助! – mathletics

相關問題