Java возвращают массивы - PullRequest
       19

Java возвращают массивы

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

У меня проблемы с возвратом массивов из пользовательского метода. Компилируется нормально, но я возвращаюсь:

[Ljava.lang.String;@20cf2c80
Press any key to continue . . .

Я использую:

System.out.println(getItem(1));

Код:

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

      return new String[] { name, desc, typeOf};

    }

Помощь? : \

Ответы [ 3 ]

8 голосов
/ 17 июля 2010

Метод toString() объекта массива фактически не проходит и создает строковое представление содержимого массива, что, как я думаю, вы хотели сделать.Для этого вам понадобится Arrays.toString().

System.out.println(Arrays.toString(getItem(1)));

Обозначение [Ljava.lang.String - это Java-код для массива String - как правило, строковое представление массива по умолчаниюравен [L, за которым следует тип элементов массива.Затем вы получаете точку с запятой и адрес памяти (или какой-то локально уникальный идентификатор) массива.

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

Вкл. Object.toString()

Причина, по которой вы получаете такую ​​строку, в том, что массивы просто наследуют, а не @Override метод Object.toString().

Метод toString для class Object возвращает строку, состоящую из имени класса, экземпляром которого является объект, символ знака @ и шестнадцатеричное представление без знака хеш-кодаобъект.Другими словами, этот метод возвращает строку, равную значению:

 getClass().getName() + '@' + Integer.toHexString(hashCode())

Чтобы вернуть представление String массива, в котором перечислены его элементы, вы можете использовать, например, Arrays.toString, а для «многомерных» массивов Arrays.deepToString

Смежные вопросы

On deepEquals и deepToString для "многомерных" массивов:


При определении собственного типа

Следует сказать, что вашиспользование String[] не лучший выбор дизайна.

Все было бы намного лучше, если бы вы определили свой собственный class BasicItem, поддерживаемый различными enum, со столькими полями final, сколько практично дляобеспечить неизменность;возможно, что-то вроде этого:

public enum ItemType {
   KNIFE, SWORD, AXE;
}
public enum Attribute {
   SELLABLE, EDIBLE;
}

public class BasicItem {

   final String name;
   final String desc;
   final ItemType type;

   final int attackAdd;
   final int defenseAdd;

   final Set<Attribute> attributes;
   //...
}

Вы действительно должны воспользоваться всеми преимуществами хорошего объектно-ориентированного дизайна.

См. также

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

Это не ошибка. JVM просто печатает адрес массива, поскольку он не печатает его содержимое. Попробуйте это и посмотрите, что происходит сейчас?

System.out.println(getItem(1)[0]);
...