2010-07-17 5 views
1

j'ai essayé printStackTrace et j'ai coverted tout à l'électricité statique (je pense) ... Cependant, les lignes 17 et la ligne 38 sont le problème ... en raison de cette erreur:Java NullPointerException

You picked up: Pickaxe 
java.lang.NullPointerException 
     at item.addInv(item.java:38) 
     at item.main(item.java:17) 
Description: Can be used to mine with. 
Press any key to continue . . . 

Ligne 17: anItem.addInv(1);

ligne 38: arr.add("Dan");

Et voici mon code:

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

public class item 
{ 
    public static int attack, defense; 
    public static ArrayList<String> arr; 
    public static String name, desc, typeOf, attackAdd, defenseAdd, canSell, canEat,earnedCoins,canEquip; 

    String stats[]; 

    public static void main(String args[]) 
    { 
     item anItem = new item(); 
     ArrayList<String> arr = new ArrayList<String>(); 
     anItem.addInv(1); 
    } 

    public static void addInv(int e) { 
     String iname = getItem(1)[0]; 
     String idesc = getItem(1)[1]; 
     int itypeOf = Integer.parseInt(getItem(1)[2]); 
     int iattackAdd = Integer.parseInt(getItem(1)[3]); 
     int idefenseAdd = Integer.parseInt(getItem(1)[4]); 
     boolean icanSell = Boolean.parseBoolean(getItem(1)[5]); 
     boolean icanEat = Boolean.parseBoolean(getItem(1)[6]); 
     int iearnedCoins = Integer.parseInt(getItem(1)[7]); 

     attack = attack + iattackAdd; 
     defense = defense + idefenseAdd; 
     System.out.println("You picked up: " + iname); 
     try { 
      arr.add("Dan"); 
     } catch(NullPointerException ex) { 
      ex.printStackTrace(); 
     } 

     System.out.println("Description: " + idesc); 
    } 

    public static String[] getItem(int e) { 

     String[] stats = new String[7]; 

     String name = "Null"; 
     String desc = "None"; 
     String typeOf = "0"; 
     String attackAdd = "0"; 
     String defenseAdd = "0"; 
     String canSell = "true"; 
     String canEat = "false"; 
     String earnedCoins = "0"; 

     if (e == 1) { 
      name = "Pickaxe"; 
      desc = "Can be used to mine with."; 
      typeOf = "2"; 
      attackAdd = "2"; 
      earnedCoins = "5"; 
     } 

     return new String[] { name, desc, typeOf, attackAdd, defenseAdd, canSell, canEat, earnedCoins}; 
    } 
} 

Comme vous pouvez le voir, ce sont ces lignes et je ne sais pas quoi faire ...: \

+0

Votre code est un bordel. Pourquoi appelleriez-vous 'getItem (idx)' sur un objet qui ne représente qu'un seul élément? Vous avez brouillé le concept d'un objet et d'un inventaire. – Eric

+1

convenu - mais OP est probablement un nouveau programmeur Java + il serait plus utile pour nous d'offrir des conseils que la critique. –

Répondre

1

String canEat = "false"; Pourquoi convertissez-vous vers et à partir de chaînes?

Vous semblez avoir embrouillé une classe item et une classe inventory.

Peut-être un Enum serait mieux:

public enum InventoryItem 
{ 
    PICKAXE("Pickaxe", "Can be used to mine with", ItemType.Tool, 
      5, 2, 0) 

    EPIC_PICKAXE("Super mega awesome Pickaxe", "Can be used to mine with, but epically", ItemType.Tool, 
      1000000, 100, 0) 


    public static enum ItemType { 
     TOOL, 
     WEAPON 
    } 

    public final String name, description; 
    public final ItemType type; 
    public final boolean canSell, canEat, canEquip; 
    public final int earnedCoins, attackAdd, defenseAdd; 

    private InventoryItem(String name, String description, ItemType type 
          int earnedCoins, int attackAdd, int defenseAdd, 
          boolean canSell, boolean canEat, boolean canEquip) 
    { 
     this.name  = name; 
     this.description = description; 
     this.type  = type 
     this.canSell  = canSell; 
     this.canEat  = canEat; 
     this.canEquip = canEquip; 
     this.earnedCoins = earnedCoins; 
    } 

    private InventoryItem(String name, String description, ItemType type 
          int earnedCoins, int attackAdd, int defenseAdd) 
    { 
     this(name, description, type, 
      earnedCoins, attackAdd, defenseAdd, 
      true, false, true); 
    } 
} 

Ensuite, vous pouvez juste avoir List<InventoryItem> inventory = new ArrayList<InventoryItem>() au sein de votre classe de joueur, et une interface directe avec cela.

+0

Parce qu'une méthode de retour ne reprend qu'un type. – nn2

+0

Retournez donc un objet! – Eric

+0

La classe "regular" est probablement meilleure que celle d'enum-enum, elle est conçue pour être un ensemble fixe d'options. –

2

La variable arr n'est pas initialisée.

variable arr main() n'est pas le même arr en fonction addInv()

juste initialize dans addInv pour y remédier.

+0

"ou sinon dans main() supprimer la re-déclaration make it juste arr = new ArrayList();" - Ne fonctionnera pas car l'attribut 'arr' est hors de portée dans la méthode principale. La meilleure chose à faire est d'initialiser 'arr' dans un constructeur – chrisbunney

+0

Oui, vous avez raison. Je l'ai enlevé – Hrishi

2

Lorsque vous appelez la méthode add() sur arr, il n'a pas encore été initialisé, d'où l'exception NullPointerException.

Étant donné que vous utiliserez probablement aussi ArrayList dans d'autres méthodes, vous devez avoir initialisé le constructeur; à savoir:

public item() { 
    arr = new ArrayList<String>(); 
} 
1

Quelques conseils (qui ne résout directement le problème):

1) la mesure du possible déclarer des variables comme privées, ou tout au plus protégé. Personnellement, je n'utilise jamais le "default" qui est l'accès au niveau du paquet (tout ce qui est dans le même paquet peut le voir).

2) N'utilisez public que pour les valeurs immuables. Une valeur immuable est quelque chose qui ne peut pas être changé (tous les membres sont finaux est le meilleur moyen de s'assurer que, ou aucune méthode ne modifie les valeurs après la construction de l'objet et les variables sont toutes privées). 3) dans la mesure du possible, toujours déclarer les variables comme étant finales (variables de classe, variables d'instance, paramètres, variables locales).

Le conseil qui vous aide directement ici est # 3. Puisque vous n'avez jamais assigné de valeur à "arr", c'est null. Si vous l'avez déclaré comme final, le compilateur vous forcerait à lui assigner une valeur, sinon le code ne compilera pas.

Cette petite chose vous fera économiser des heures pendant que vous commencez à programmer. Dans mon cas, j'ai fait quelque chose de similaire, pas exactement la même chose (vraiment j'ai violé le # 2 d'une façon ou d'une autre) et cela m'a coûté environ une semaine. Je programme en Java depuis plus de 15 ans maintenant ...Si je peux perdre une semaine à cause de quelque chose comme ça, pense combien de temps vous pouvez perdre :-)