Così ho preso una classemetodo Java di riferimento getta NPE
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
è un'interfaccia la cui attuazione è impostato tramite setController
dopo la MenuBar ist creato. Il codice genera una NullpointerException a menu.add(createMenuItem("Report", controller::writeReport))
che può essere causata solo da controller::writeReport
. Se sostituisco questo con un lambda come () -> controller.writeReport()
non viene lanciato alcun NPE.
1. Perché controller::writeReport
lancia un NPE?
2. Perché la lambda non lancia un NPE?
La parte divertente è: Se sostituisco il lambda con il riferimento al metodo usato in precedenza, dopo averlo eseguito una volta con lambda, non vengono più lanciati NPE.
Qualcuno ha idea del perché possa essere? Qualche stranezza javac/eclissi?
Qual è lo stack di chiamate di NPE? Cos'è esattamente null? – Arkadiy
questa segnalazione di bug sembra rilevante: https://bugs.openjdk.java.net/browse/JDK-8131323 – DHall
'controller :: writeReport lancia un NPE?' Perché 'controller' è nullo. Stai provando a fare riferimento a un metodo su un oggetto nullo -> NPE. – njzk2