【问题标题】:How to clone an array when containing null element in javajava中包含空元素时如何克隆数组
【发布时间】:2013-02-19 13:00:50
【问题描述】:

如果我想克隆一个对象数组,但是数组中有一些空元素,如何实现clone()方法?例如:

class A {};

class B implements Cloneable {
    A[] arrayFoo = new A[maxNumber];
    // let some elements in arrayFoo be null
    // now I want to implement a clone method
    public B clone() throws CloneNotSupportedException {
        B result = (B) super.clone()
        return result;
    }
}

这将引发空指针异常。如何修复此错误?

【问题讨论】:

  • 您的代码无法编译...class not Class, implements not implement
  • 即使在我修复它之后,它也不会抛出 NullPointerException
  • 你使用的是什么版本的java?@Iswanto
  • @user1237575:我使用的是 java 6

标签: java arrays nullpointerexception clone


【解决方案1】:

试试这个(它不会抛出 NullPointerException):

class A {};


class B implements Cloneable {
    public static final int MAX_NUMBER = 42;
    A[] arrayFoo = new A[MAX_NUMBER];
    // let some elements in arrayFoo be null
    // now I want to implement a clone method
    public B clone() throws CloneNotSupportedException {
        B result = (B) super.clone();
        return result;
    }



    public static void main(String[] args) throws CloneNotSupportedException {
        B b1 = new B();
        B b2 = b1.clone();

        System.out.println("Done!");
    }
}

结论: 当您发布此类问题时,始终准确指定 NullPointerException 发生在哪一行代码,并且始终确保在问题中发布该特定行。


我的猜测(如果您来自 C++ 背景)是您在仅声明为的成员变量上调用 clone:

B b;

这会引发 NullPointerException,但不是因为 clone 实现。 B b;不在 Java 中实例化任何东西。它只是声明了一个可以指向B 对象的引用。但是引用被初始化为null。因此,在 b 上调用 clone 将试图在不存在的对象上调用 clone。

【讨论】:

  • 您的最后一个代码示例无法在 Java 中编译。数据成员和数组确实有默认初始化,但局部变量没有。
  • @EyalSchneider 对不起。你说得对。您会认为,我必须在 try/catch 块之外将 Input/OutputStreams 初始化为 null 的所有时间都会让人无法忽视这一事实。但不幸的是,它没有。我更新了答案以反映类似但可编译的场景。
【解决方案2】:

克隆数组执行浅拷贝,空值被正确拷贝。它不会产生任何 NullPointerException,除非数组变量本身为空。

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 2013-01-26
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    相关资源
    最近更新 更多