【问题标题】:Can Java's Array clone() return null?Java 的 Array clone() 可以返回 null 吗?
【发布时间】:2017-06-24 14:05:26
【问题描述】:

鉴于此代码:

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() 中使用这个实现有一个空对象?我已经在 J​​DK 1.8 和几个 Android 设备中测试了 Array clone() 并且它永远不会返回 null。

关于 2 Arrays.sort() 我知道他们对错误的引用进行了排序,我认为它们与这次崩溃无关,但我想按原样分享代码。

PS:另外,我在各种各样的手机中都遇到了这种崩溃,所以我认为这与修改后的手机中 clone() 的奇怪实现无关。

【问题讨论】:

  • 澄清一下,通过构造函数传入的sounds不是null
  • 你的 Sound 类是否实现了 Clonable ?
  • @MichaelDodd 如果它为空,我们将在构建对象时有一个 NPE
  • @MickMnemonic 但在这种情况下,我将有一个带有错误克隆声音的空数组,对吧?

标签: java android arrays clone


【解决方案1】:

谜团已解开,这个类在缓存中使用 Gson 实例化,正如我所见 here 这即使没有空的构造函数也是可能的。

这个类被proguard混淆了,所以它不能恢复序列化的信息,它被初始化为空值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2012-07-06
    • 2016-10-17
    • 2010-11-10
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多