Java NullPointerException - PullRequest
       3

Java NullPointerException

1 голос
/ 18 июля 2010

Я попробовал printStackTrace и покрыл все статическим (я думаю) ... однако строки 17 и 38 являются проблемой ... из-за этой ошибки:

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 . . .

Строка 17: anItem.addInv(1);

Строка 38: arr.add("Dan");

А вот и мой код:

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};
    }
}

Как видите, это те строки, и я не знаю, что делать ...: \

Ответы [ 4 ]

2 голосов
/ 18 июля 2010

Переменная arr не инициализирована.

Переменная arr в main () не совпадает с arr в функции addInv ()

Просто инициализируйте его в addInv, чтобы исправить это.

2 голосов
/ 18 июля 2010

Когда вы вызываете метод add () для arr, он еще не был инициализирован, следовательно, исключение NullPointerException.

Поскольку вы, вероятно, будете использовать ArrayList и в других методах, вы должны инициализировать егов конструкторе;т.е.:

public item() {
   arr = new ArrayList<String>();
}
1 голос
/ 18 июля 2010

Несколько советов (один, который напрямую решает проблему):

1) везде, где это возможно, объявляйте переменные как закрытые или максимально защищенные.Лично я никогда не использую «по умолчанию», то есть доступ на уровне пакета (все, что находится в одном пакете, может видеть его).

2) Используйте public только для неизменяемых значений.Неизменное значение - это то, что не может быть изменено (все члены являются окончательными, это лучший способ убедиться, что или метод не изменяет какие-либо значения после того, как объект создан и все переменные являются частными)Можно всегда объявлять переменные как окончательные (переменные класса, переменные экземпляра, параметры, локальные переменные).

Единственный совет, который вам здесь поможет, это # ​​3.Поскольку вы никогда не присваивали значение arr, оно равно null.Если вы объявите его как final, компилятор заставит вас действительно присвоить ему значение, если вы этого не сделаете, код не скомпилируется.

Выполнение этой мелочи сэкономит вам часы времени, когда вы начнете программировать.В моем случае я сделал что-то похожее, не совсем то же самое (на самом деле я нарушил что-то вроде 2-го раунда), и это стоило мне около недели.Я программирую на Java уже более 15 лет ... если я могу потратить впустую неделю из-за чего-то подобного, подумайте, сколько времени вы можете потратить: -)

1 голос
/ 18 июля 2010

String canEat = "false"; Почему вы конвертируете в и из строк?

Кажется, вы запутали класс item и класс inventory.

Возможно, Enum будет лучше:

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);
    }
}

Тогда вы можете просто иметь List<InventoryItem> inventory = new ArrayList<InventoryItem>() в классе вашего игрока и напрямую взаимодействовать с ним.

...