当在超类的初始化中使用变量时,覆盖变量会创建NPE

时间:2017-09-09 16:49:03

标签: kotlin

说我们有以下设置:

open class Foo(open val img: Image) {
    val use = img.graphics
}
class Bar(override val img: BufferedImage) : Foo(img)

初始化时,使用img.width会创建NPE。我认为问题是,显然即使img直接在Bar中传递给Foo的构造函数,当它在Foo中使用时它并不指向它,而是指向被覆盖的变量酒吧班。我怎么能避免这个?

1 个答案:

答案 0 :(得分:1)

此行为是由于CREATE TABLE tenant ( id INT NOT NULL, nome VARCHAR(255) NOT NULL, PRIMARY KEY (id) ); CREATE TABLE customer ( id INT NOT NULL, id_tenant INT NOT NULL, nome VARCHAR(255) NOT NULL, PRIMARY KEY (id), FOREIGN KEY (id_tenant) REFERENCES tenant(id), -- pra ter a FK composta, tem que ter chave composta na tabela de origem UNIQUE (Id,id_tenant) ); CREATE TABLE [order] ( id INT NOT NULL, id_customer INT NOT NULL, id_tenant INT NOT NULL, nome VARCHAR(255) NOT NULL, PRIMARY KEY (id), FOREIGN KEY (id_customer, id_tenant) REFERENCES customer (id, id_tenant), FOREIGN KEY (id_tenant) REFERENCES tenant(id) ); 的getter被覆盖并返回不同字段的值(因为img覆盖Bar不同类型的事实所致,这需要创建另一个img类型的字段。在BufferedImage中分配该字段之前执行Foo构造函数。

通常,您应该避免在类的初始化逻辑中使用open成员,因为它们可能在子类中被覆盖,并且可能依赖于某些状态,这些状态在超类初始化时尚未正确初始化。

对于您的特定情况,请在Bar构造函数中为img设置一个简单参数并明确使用该参数:

Foo