【问题标题】:Java Number Randomizer is getting null as outputJava Number Randomizer 的输出为 null
【发布时间】:2020-01-24 21:20:43
【问题描述】:

在这个程序中,我创建了一个名为ArrayExample 的类,并创建了一个随机数来填充其元素,并使用它创建了一个toString() 方法。为什么我的输出为 null?该代码看起来没有错误。 :

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

【问题讨论】:

  • StringBuilder sb = new StringBuilder(array.length);错误可能是数组尚未初始化
  • 你创建了new ArrayExample[5],但你没有在里面放任何东西。这就是为什么它只包含五次null

标签: java arrays loops null output


【解决方案1】:

您正在创建ArrayExample[5],它是一个由五个ArrayExample 对象组成的数组,而不是带有5 构造函数参数的单个ArrayExample。看起来您的意图是调用构造函数 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
    }

将你的内部类设为静态,以便你的 main 方法可以访问它:

public static class ArrayExample {

并修复您的 .toString() 方法:

  public String toString() {
    return Arrays.toString(array);
  }

【讨论】:

    【解决方案2】:

    问题出在这段代码中:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      • 2019-07-14
      • 2017-12-25
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多