Java中的Array clone()方法能返回null吗?

3

考虑以下代码:

public class SoundAndFilterCollection {

    private final Sound[] sounds;
    private final Filter[] filters;

    public SoundAndFilterCollection(Sound[] sounds, Filter[] filters) {
        this.sounds = sounds.clone();
        this.filters = filters.clone();

        Arrays.sort(sounds);
        Arrays.sort(filters);
    }

    public Sound[] getSounds() {
        return sounds.clone();
    }

    public Filter[] getFilters() {
        return filters.clone();
    }
}

我在执行 getSounds() 时遇到了 NullPointerException:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object gab[].clone()' on a null object reference
at com.mycompany.messenger.push2talk.domain.SoundAndFilterCollection.getSounds(SoundAndFilterCollection.java:24)
at com.mycompany.messenger.shareinchat.chatbar.hiddenpanel.views.soundstickers.presenter.SoundStickersPanelPresenter.setSoundsViews(SoundStickersPanelPresenter.java:92)
at com.mycompany.messenger.shareinchat.chatbar.hiddenpanel.views.soundstickers.presenter.SoundStickersPanelPresenter.access$000(SoundStickersPanelPresenter.java:20)
at com.mycompany.messenger.shareinchat.chatbar.hiddenpanel.views.soundstickers.presenter.SoundStickersPanelPresenter.access$200(SoundStickersPanelPresenter.java:20)
at com.mycompany.messenger.shareinchat.chatbar.hiddenpanel.views.soundstickers.presenter.SoundStickersPanelPresenter$3.onDoneWithContext(SoundStickersPanelPresenter.java:59)
at com.mycompany.messenger.shareinchat.chatbar.hiddenpanel.views.soundstickers.presenter.SoundStickersPanelPresenter$3.onDoneWithContext(SoundStickersPanelPresenter.java:56)
at com.mycompany.deferred.Done$UIContextual.onDone(Done.java:35)

我的问题是:在这个实现中,如何在getSounds()中有一个空对象?我已经测试了JDK 1.8中的Array clone()和一些Android设备,它从未返回null。
关于2个Arrays.sort(),我知道它们正在排序错误的引用,我不认为它们与此崩溃相关,但我想分享代码就像它是的那样。
另外,我在许多手机上都遇到了这个崩溃,所以我不认为它与修改后的手机中clone()的奇怪实现有关。

只是为了澄清,通过构造函数传递的 sounds 不为 null 吗? - Michael Dodd
你的 Sound 类实现了 Clonable 接口吗? - Anis LOUNIS aka AnixPasBesoin
2
如果它是null,当构建对象时我们将会有一个NPE。 - Guillermo Merino
1
@MickMnemonic 但是在那种情况下,我会得到一个空数组和错误克隆的声音,对吗? - Guillermo Merino
显示剩余2条评论
1个回答

0
谜团解开了,这个类在缓存中使用Gson实例化,正如我在这里看到的那样,即使没有空构造函数也是可能的。
这个类被Proguard混淆了,所以它无法恢复序列化信息,并且被初始化为null值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接