簡體   English   中英

如何解決此空指針異常錯誤(Java)?

[英]How do i resolve this null pointer exception error (Java)?

我正在基於健身系統在bluej上創建一個項目。 項目中有一個名為“ Card”的父類,該父類的子類包括Loyalty,Standard和staff,它們是Gym系統可以容納的所有類型的卡。該系統還具有多個區域,例如游泳池,桑拿浴室等。還有一個sitemanager類,其中包含所有體育館信息,例如,有多少扇門以及區域的詳細信息。

在運行名為centerIO的IO類時,嘗試運行代碼的這一部分;

 private void addCard()
    {
        System.out.println("Enter card id:");
        int id = reader.nextInt();
        Card cr = hatfield.getCard(id);
        hatfield.addCard(cr);


        }

我遇到了一個問題,該問題指向zones類中的方法。 這是null異常所指向的方法

public void addCardtoZone(Card C)

{

    cards.put(C.getId(),C);

}

站點管理器有兩個帶有“區域”和“門”的哈希圖,“區域”具有該區域中當前所有卡的哈希圖,因此它將保存諸如說明區域中當前有多少卡等方法。如何修復此代碼,以便它實際上將卡添加到該網站嗎? 我不明白為什么這不起作用,因為當我從Zone類中運行該方法時,它可以完美地工作。

這是我在IO類中調用的方法

public void addCard(Card cd)
{

    Outside.addCardtoZone(cd);

}

編輯:put方法將一個鍵和一個對象放入哈希圖中

private HashMap cards = new HashMap<Integer,Card>();

這是卡類的示例(忠誠度,標准,職員等3個其他類的超類。)

public class Card
{
public String name;

public int rating;
public int credits;
public String centre;
public int type;

//Public constructor
public Card(String nam, int rat, int cred)
{

    name = nam;
    rating = rat;
    credits = cred;


}

public int getId() //getId() has been overridden in the child classes
{

    return 0;

}

public String getName()
{
    return name;
}  

/** returns member's rating
 * @return member's rating
 */
public int getRating()
{
    return rating;
}

/** changes a member's rating
 * @param rat new rating 
 */
public void changeRating(int rat)
{
    rating = rat;
}



}

}

public void addCardToZone(Card C) {
    if(cards == null) {
        cards = new HashMap<Integer, Card>();
    }
    cards.put(C.getId(),C);
}

現在,您的addCardToZone方法將檢查cards是否為null 如果為null ,它將對其進行初始化。 之后,您只需照常put卡即可。 if僅在第一次調用addCardToZone輸入addCardToZone

而不是告訴您解決方案是什么(這有點困難,因為我們看不到所有可能相關的源代碼...),而是如何診斷這一點。

1)使用stacktrace識別引發NPE的代碼行。

您已將其標識為:

  cards.put(C.getId(),C);

2)找出可能導致NPE的原因。

在這種情況下,只有兩種可能的原因:

  • 如果cardsnullcards.put將拋出一個NPE。
  • 如果cnullc.getId()將引發NPE。

3)在上下文中消除邏輯上不可能的情況。

例如,如果將cards聲明為final並且已將其初始化為非null值,則可以消除這種可能的原因。 或者,如果在上一條語句中可以以某種方式使用c變量(如果該變量為null則失敗),則可以消除該變量。

4)向后遍歷重復的代碼3)...

5)如果失敗,請使用調試器或明智的日志記錄/跟蹤打印來消除可能的原因或確認可疑之處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM