gpt4 book ai didi

java - 在我的自定义初始化程序启动之前,父类(super class)抛出异常

转载 作者:行者123 更新时间:2023-11-30 08:10:26 25 4
gpt4 key购买 nike

我有自己的类,它扩展了一个外部类,该类重写了一个外部类,使其文本始终“Hello”。它看起来像:

import ext.ExternalClassA;

public class ClassB extends ExternalClassA {
private String customText = "Hello";

public ClassB() { // line 6
}

@Override
public void setText(String newText) {
return;
}

@Override
public String getText() {
return customText;
}
}

但是,当我运行程序时,它崩溃并出现如下错误:

Exception in thread "main" java.lang.NullPointerException
at ext.ExternalClassA.setup(ExternalClassA.java:123)
at ext.ExternalClassA.<init>(ExternalClassA.java:45)
at my.ClassB.<init>(ClassB.java:6)

当我查看 ExternalClassA.java 时,我看到了以下内容:

// imports...

public class ExternalClassA {
private String text;
// Other variables

public ClassB() {
text = "Default";
setup(); // line 45
}

// more code...

private void setup() {
if (text == null)
return;
String textStr = getText().toString(); // line 123

// more code...
}

// more code...
}

我做错了什么?我该如何修复它?是外部类的问题吗?

最佳答案

问题在于 ExternalClassA 正在尝试使用其 getText() 方法来获取文本。从前面几行来看,这应该是安全的。然而,您不知道的是,您对 getText() 的重写并不总是返回 text。这对您来说可能看起来不错,因为您使用 customText,它设置为 "Hello"但是!直到父类(super class)的初始值设定项退出后才会发生此分配。这是初始化的顺序:

仅一次:

  1. 父类(super class)的静态变量
  2. 父类(super class)的静态构造函数
  3. 这个静态变量
  4. 这个静态构造函数

每个新对象:

  • 父类(super class)变量
  • 父类(super class)的构造函数
  • 这个变量
  • 这个构造函数
  • 因此,当父类(super class)调用 getText() 时,它就会进入您的父类(super class)。在您的系统中,此时 customTextnull,但 superText“Default”

    这可能看起来是双赢,因为在父类(super class)完成初始化之前无法设置您的值,但有一个解决方案!它就在相同的行为中。将 customText 默认为 null 的 Java 机制也将原语默认为 0false。我们可以使用它并像这样修改ClassB:

    import ext.ExternalClassA;

    public class ClassB extends ExternalClassA {
    private String customText = "Hello";
    private boolean hasStarted = true;

    public ClassB() {
    }

    @Override
    public void setText(String newText) {
    return;
    }

    @Override
    public String getText() {
    if (!hasStarted)
    return super.getText();
    return customText;
    }
    }

    请注意,只有在父类(super class)的构造函数返回后,hasStarted 才会为 true

    tl;博士

    <小时/>

    What am I doing wrong?

    您不知道初始化中的操作顺序会导致您的字符串为 null,直到您的构造函数拥有控制权。

    How can I fix it?

    在 super 初始化期间回退到 super 类方法。

    Is it a problem with the external class?

    是的,父类(super class)不应该检查变量来假定方法的返回值。

    关于java - 在我的自定义初始化程序启动之前,父类(super class)抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30466646/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com