0

Oh Great Mages of StackOverflow,

I'm running into a problem when using FileChooser in Java. This question has been asked before and I've done the reading but I'm still stuck. When the FileChooser dialogue window for saving a file opens and the user clicks cancel, the program continues to run fine but a NullPointerException gets thrown.

The code:

save.setOnAction(e -> { // set an action event for save

            File gameFile = new File(defaultFileName);
            if (gameFile.exists()) { // check if file exists, if so quietly override
                saveGame(gameMap, player, new File(defaultFileName));
                txtArea.appendText("Game saved\n");
            } else {// if not then allow user to create file and add
                FileChooser fileToSave = new FileChooser();
                FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("Game files (*.dat)", "*.dat");
                gameFile = fileChooser.showSaveDialog(primaryStage); // get file user chose
                if (gameFile == null) {
                    txtArea.appendText("Game save cancelled\n");
                    return; // do nothing
                } else {
                    defaultFileName = gameFile.toString(); // get the name of file user saved and set as new default
                    saveGame(gameMap, player, gameFile); // save game
                    txtArea.appendText("Game saved\n"); // let user know game was saved
                }
            }
        });

The exception gets thrown here if user cancelled:

gameFile = fileChooser.showSaveDialog(primaryStage);

What I tried: showSaveDialog() returns null if the user clicks cancel or 'X', and I'm sending a message in the dialogue box from the application to show the save was cancelled and then I do nothing by simply return. But even though I handle null the NullPointerException gets thrown. I tried catching it but I read you cannot catch a NullPointerException and it's bad practice and sure enough I couldn't.

The stack trace is here when the exception gets thrown:

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
        at pkgfinal.project.Adventure.lambda$start$1(Adventure.java:233)
        at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
        at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
        at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
        at javafx.event.Event.fireEvent(Event.java:198)
        at javafx.scene.Node.fireEvent(Node.java:8411)
        at javafx.scene.control.Button.fire(Button.java:185)
        at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
        at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
        at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
        at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
        at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
        at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
        at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
        at javafx.event.Event.fireEvent(Event.java:198)
        at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
        at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
        at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
        at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:394)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:432)
        at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:410)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
        at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
        at com.sun.glass.ui.View.notifyMouse(View.java:937)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$3(WinApplication.java:177)
        at java.lang.Thread.run(Unknown Source)

Up to this point I do not know how to get around this

  • 1
    I'm pretty sure the only way you could get a null pointer exception from the line you state and with that stack trace is if `fileChooser` is null. Are you **sure** that line is line 233? – James_D Feb 17 '20 at 23:23
  • 1
    See https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it - if still stuck [mcve] please – kleopatra Feb 17 '20 at 23:32
  • 3
    Note that you have `FileChooser fileToSave = new FileChooser()` but two lines later have `gameFile = fileChooser.showSaveDialog(primaryStage)`. Notice the difference in variable name? You initialize `fileToSave` but attempt to use `fileChooser`. – Slaw Feb 18 '20 at 02:38
  • I found the problem. I had to use fileToSave.showSaveDialog(primaryStage) not fileChooser.showSaveDialog(primaryStage), thanks – Matias Galante Feb 19 '20 at 21:21

0 Answers0