Java Number Randomizer становится нулевым в качестве вывода - PullRequest
0 голосов
/ 25 января 2020

В этой программе я создал класс с именем ArrayExample и создал случайное число для заполнения его элементов, а также метод toString(). Почему я получаю нулевое значение в качестве результата? Код не содержит ошибок из того, что кажется. :

public class arran {

    public static void main(String[] args) {
        ArrayExample[] no1 = new ArrayExample[5];
        System.out.println(Arrays.toString(no1));
    }

    public class ArrayExample {
        int[] array;

        ArrayExample(int len) {
            array = new int[len];
            for (int i = 0; i < array.length; i++) {
                array[i] = (int) (Math.random() * 100);
            }
        }

        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder(array.length);
            for (int i = 0; i < array.length; i++) {
                sb.append(array[i]);

            }
            return sb.toString();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 25 января 2020

Проблема в следующем коде:

ArrayExample[] no1 = new ArrayExample[5];
System.out.println(Arrays.toString(no1));

Это объявляет массив определенного типа (ArrayExample) и определенной длины (5), но больше ничего не делает. Эта первая строка приводит к ссылке на переменную no1, содержащей пять нулевых значений. Это то, что вы видите при распечатке.

[null, null, null, null, null]

Вот еще один пример, но с использованием Object, чтобы подчеркнуть, что код ничего не делает, кроме создания пустого массива и печати нулевых значений.

Object[] no2 = new Object[5];
System.out.println(Arrays.toString(no2));

Этот код имеет такой же вывод:

[null, null, null, null, null]

Вот код, который инициализирует массив (как вы уже делали), а затем создайте новый экземпляр ArrayExample и сохранить его на каждом элементе массива. (Я также переместил ArrayExample из определения основного класса, чтобы он компилировался).

public class Example {

    public static void main(String[] args) {
        ArrayExample[] no1 = new ArrayExample[5];

        no1[0] = new ArrayExample(10);
        no1[1] = new ArrayExample(10);
        no1[2] = new ArrayExample(10);
        no1[3] = new ArrayExample(10);
        no1[4] = new ArrayExample(10);

        System.out.println(Arrays.toString(no1));
    }
}

class ArrayExample {
    // use same class contents as your original post
}

Вот результат запуска этого обновленного кода:

[6474373150570442153, 27524825597078735826, 58127219204026904839, 90611080549351937198, 6503557163540938849]

Еще один вариант настройки содержимое вашего массива будет использовать этот однострочный:

Arrays.setAll(no1, k -> new ArrayExample(10));
0 голосов
/ 25 января 2020

Вы создаете ArrayExample[5], который представляет собой массив из пяти ArrayExample объектов, а не один ArrayExample с аргументом конструктора 5. Похоже, что вы намеревались вызвать конструктор ArrayExample(int len), но он никогда не вызывался.

Попробуйте вместо этого:

 public static void main(String[] args) {
        ArrayExample no1 = new ArrayExample(5); // Invokes the constructor you wrote
        System.out.println(no1.toString()); // Uses the toString method your wrote
    }

Сделайте ваш внутренний класс stati c, чтобы он мог быть доступным для вашего основного метода:

public static class ArrayExample {

И исправить ваш .toString() метод:

  public String toString() {
    return Arrays.toString(array);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...