gpt4 book ai didi

Java 方法引用抛出 NPE

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:12:50 25 4
gpt4 key购买 nike

所以我上课了

public class MenuBar extends JMenuBar {

MenuBarController controller;

public MenuBar() {
JMenu menu = new JMenu("File");
menu.add(createMenuItem("Report", controller::writeReport));
menu.add(createMenuItem("Save", controller::save));
menu.add(createMenuItem("Import", controller::importFile));
menu.add(createMenuItem("Clear DB", controller::clearDatabase));
add(menu);
}

public void setController(MenuBarController controller) {
this.controller = controller;
}
}

MenuBarController 是一个接口(interface),其实现是在 MenuBar 创建后通过 setController 设置的。代码在 menu.add(createMenuItem("Report", controller::writeReport)) 处抛出 NullpointerException,这只能由 controller::writeReport 引起。如果我用 () -> controller.writeReport() 之类的 lambda 替换它,则不会抛出 NPE。

<强>1。为什么 controller::writeReport 抛出 NPE?

<强>2。为什么 lambda 不抛出 NPE?

有趣的是:如果我用 lambda 运行一次后用之前使用的方法引用替换 lambda,则不会再抛出 NPE。

有人知道为什么会这样吗?一些 javac/eclipse 怪异?

最佳答案

controller::writeReport 抛出 NPE,因为 controller 在评估行时为 null。

() -> controller.writeReport() 不会抛出 NPE,因为在运行 lambda 时,controller 已被赋予一个值。

关于Java 方法引用抛出 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33554510/

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