setLabel Недвижимость с причиной NPE

голоса
1

Я пытаюсь BoundTableModelв первый раз, и когда я попытался установить ярлыки моих свойств, у меня есть NullPointerException.

[EDT] 0:0:8,239 - Exception: java.lang.NullPointerException - null
java.lang.NullPointerException
    at com.codename1.properties.PropertyBase.putClientProperty(PropertyBase.java:131)
    at com.codename1.properties.PropertyBase.setLabel(PropertyBase.java:192)
    at our.app.forms.UnitsForm.<init>(UnitsForm.java:54)

NPE будет в этом забросил блоке кода, но я не понимаю , почему. propertiesЯвляются public finalи инстанциировано внутри UserHistory, но метка не установлена там. Это лучше , чтобы установить их позже, так как они должны быть переведены нашими TranslationManager.

UiBinding ui = new UiBinding();
List<UserHistory> histories = RestManager.getHistory();
UserHistory prototype = new UserHistory();
prototype.dateCreate.setLabel(Date); 
prototype.balanceUpdate.setLabel(Variation); 
prototype.action.setLabel(Action);

UiBinding.BoundTableModel tb = ui.createTableModel(histories, prototype);
tb.setColumnOrder(prototype.dateCreate, prototype.balanceUpdate, prototype.action);
Table table = new Table(tb);

Я не понимаю , как setLabel(String)из Propertyможет бросить NullPointerException, любую идею?

EDIT: Вот классы , которые терпят неудачу, то первое является AbstractEntity:

public abstract class AbstractEntity implements Serializable, PropertyBusinessObject 
{
    public final LongProperty<AbstractEntity> id = new LongProperty<>(id);

    public final IntProperty<AbstractEntity> version = new IntProperty<>(version);

    public final Property<Date, AbstractEntity> dateCreate = new Property<>(dateCreate, Date.class);

    public final Property<Date, AbstractEntity> dateUpdate = new Property<>(dateUpdate, Date.class);

    protected List<PropertyBase> getPropertyList() 
    {
        List<PropertyBase> list = new ArrayList<>();
        list.add(id);
        list.add(version);
        list.add(dateCreate);
        list.add(dateUpdate);
        return list;
    }

    protected List<PropertyBase> getExcludePropertyList()
    {
        List<PropertyBase> list = new ArrayList<>();
        return list;
    }

    @Override
    public PropertyIndex getPropertyIndex()
    {
        PropertyBase[] properties = getPropertyList().toArray(new PropertyBase[getPropertyList().size()]);
        PropertyIndex index =  new PropertyIndex(this, getName(), properties);

        for(PropertyBase excluded : getExcludePropertyList())
        {
            index.setExcludeFromJSON(excluded, true);
            index.setExcludeFromMap(excluded, true);
        }

        return index;
    }
}

А вот ребенок класс, который я попытался показать в таблице:

public class UserHistory extends AbstractEntity 
{

    public final Property<User, UserHistory> user = new Property<>(user, User.class);

    public final DoubleProperty<UserHistory> balanceUpdate = new DoubleProperty<>(balanceUpdate);

    public final Property<String, UserHistory> action = new Property<>(action);

    public UserHistory() {}

    @SuppressWarnings(rawtypes)
    protected List<PropertyBase> getPropertyList() 
    {
        List<PropertyBase> list = super.getPropertyList();
        list.add(user);
        list.add(balanceUpdate);
        list.add(action);
        return list;
    }
}
Задан 27/11/2018 в 14:58
источник пользователем
На других языках...                            


1 ответов

голоса
1

Это не будет работать.

Ваш подход интересен, но он ведет себя по-разному от общей реализации в одном существенным образом: индекс создается лениво. Таким образом, инициализация работа по индексу не на самом деле произошло во всех случаях.

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

Что-то, что «может» работать так:

public abstract class AbstractEntity implements Serializable, PropertyBusinessObject 
{
    public final LongProperty<AbstractEntity> id = new LongProperty<>("id");

    public final IntProperty<AbstractEntity> version = new IntProperty<>("version");

    public final Property<Date, AbstractEntity> dateCreate = new Property<>("dateCreate", Date.class);

    public final Property<Date, AbstractEntity> dateUpdate = new Property<>("dateUpdate", Date.class);

    private PropertyIndex index;


    protected AbstractEntity() {
        getPropertyIndex();
    }

    protected List<PropertyBase> getPropertyList() 
    {
        List<PropertyBase> list = new ArrayList<>();
        list.add(id);
        list.add(version);
        list.add(dateCreate);
        list.add(dateUpdate);
        return list;
    }

    protected List<PropertyBase> getExcludePropertyList()
    {
        List<PropertyBase> list = new ArrayList<>();
        return list;
    }

    @Override
    public PropertyIndex getPropertyIndex()
    {
        if(idx == null) {
            PropertyBase[] properties = getPropertyList().toArray(new PropertyBase[getPropertyList().size()]);
            index =  new PropertyIndex(this, getName(), properties);

            for(PropertyBase excluded : getExcludePropertyList())
            {
                index.setExcludeFromJSON(excluded, true);
                index.setExcludeFromMap(excluded, true);
            }
        }
        return index;
     }
}

Оригинальный ответ ниже:

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

Ответил 28/11/2018 в 04:20
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more