J'ai un problème avec l'exécution de mon application sudoku JavaFX.

J'ai une méthode void updateBoard () qui utilise l'objet sudokuBoard et attribue les numéros de textFields à chaque champ sudokuBoard. Un textField est responsable d'un champ sudokuBoard.

public void updateBoard() {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if ((Integer) Integer.parseInt(textFields[i][j].getText()) != null) {
                    sudokuBoard.set(i, j, Integer.parseInt(textFields[i][j].getText()));
                } else {
                    sudokuBoard.set(i, j, null);
                }
                index++;
            }
        }
    } 

Ensuite, j'ai aussi une méthode boolean checkerBoard () qui vérifie si sudoku Board est correctement résolu.

public boolean checkBoard() {
        updateBoard();
        int counter = 0;
        if (difficultyLevel.getLevel() == 0) {
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9; j++) {
                    if (counter % 5 == 0) {
                        if (sudokuBoard.getValue(i, j) == null) {
                            return false;
                        }
                        if (sudokuBoard.getValue(i, j) != difficultyLevel.getRejectedNumbers()[i][j]) {
                            return false;
                        }
                    }
                    counter++;
                }
            }
        }
        if (difficultyLevel.getLevel() == 1) {
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9; j++) {
                    if (counter % 3 == 0) {
                        if (sudokuBoard.getValue(i, j) == null) {
                            return false;
                        }
                        if (sudokuBoard.getValue(i, j) != difficultyLevel.getRejectedNumbers()[i][j]) {
                            return false;
                        }
                    }
                    counter++;
                }
            }
        }
        if (difficultyLevel.getLevel() == 2) {
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9; j++) {
                    if (counter % 2 == 0) {
                        if (sudokuBoard.getValue(i, j) == null) {
                            return false;
                        }
                        if (sudokuBoard.getValue(i, j) != difficultyLevel.getRejectedNumbers()[i][j]) {
                            return false;
                        }
                    }
                    counter++;
                }
            }
        }
        return true;
    }

Lorsque j'appelle la méthode updateBoard () de la méthode checkBoard () , cela fonctionne parfaitement comme il se doit.

Cependant, lorsque j'appelle cette méthode (après avoir appuyé sur le bouton):

public void saveGameSudokuBoardButtonPushed() throws Exception {
    updateBoard();
    Stage stage = (Stage) saveGameSudokuBoardButton.getScene().getWindow();
    FileChooser fileChooser = new FileChooser();
    fileChooser.setTitle("Zapisz plik");
    File file = fileChooser.showSaveDialog(stage);
    FileSudokuBoardDao fileSudokuBoardDao = null;
    try {
        fileSudokuBoardDao = (FileSudokuBoardDao) SudokuBoardDaoFactory.getFileDao(file.toPath().toString()); 
    } catch (NullPointerException exception) {
        exception.printStackTrace();
    }
    
    fileSudokuBoardDao.write(sudokuBoard);
}

J'obtiens l'erreur suivante:

 Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1787)
    at javafx.fxml/javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1670)
    at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
    at javafx.graphics/javafx.scene.Node.fireEvent(Node.java:8879)
    at javafx.controls/javafx.scene.control.Button.fire(Button.java:200)
    at javafx.controls/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:206)
    at javafx.controls/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)
    at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
    at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3851)
    at javafx.graphics/javafx.scene.Scene$MouseHandler.access$1200(Scene.java:3579)
    at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1849)
    at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2588)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:397)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:434)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:390)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:433)
    at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556)
    at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:76)
    at jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at javafx.base/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:273)
    at javafx.fxml/com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:83)
    at javafx.fxml/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1784)
    ... 47 more
Caused by: java.lang.NumberFormatException: For input string: ""
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
    at java.base/java.lang.Integer.parseInt(Integer.java:662)
    at java.base/java.lang.Integer.parseInt(Integer.java:770)
    at gui.SudokuBoardController.updateBoard(SudokuBoardController.java:86)
    at gui.SudokuBoardController.saveGameSudokuBoardButtonPushed(SudokuBoardController.java:174)
    ... 58 more

Process finished with exit code 0

Je ne sais pas pourquoi le problème se produit lors de l'appel de la méthode saveGameSudokuBoardButtonPushed () et il ne se produit pas lors de l'appel de la méthode checkBoard () .

La méthode saveGameSudokuBoardButtonPushed () fonctionne parfaitement quand il n'y a pas de méthode updateBoard () appelée à l'intérieur.

//EDIT//

Je dois ajouter que mon sudokuBoard a implémenté des niveaux de difficulté qui suppriment certains champs de sudokuBoard. Ces champs supprimés sont enregistrés dans ces classes de niveau de difficulté et à leur place, il y a nul dans le champ sudokuBoard. Ensuite, les champs sudokuBoard sont affectés à textFields sur l'interface graphique. Il est donc normal que lorsque j'essaie de sauvegarder le tableau, certains champs soient vides. Cependant, je me demande pourquoi cela dépend si j'utilise la méthode updateBoard () dans la méthode checkBoard () et saveGameSudokuBoardButtonPushed () si l'implémentation est la même pour les deux

2
Vader20FF 9 déc. 2020 à 15:30

2 réponses

Meilleure réponse

"" ne peut pas être analysé en un entier. Par conséquent, vous devez ignorer l'analyse d'une chaîne vide. Vous pouvez le faire comme suit:

if (!textFields[i][j].getText().isBlank()) {
    sudokuBoard.set(i, j, Integer.parseInt(textFields[i][j].getText()));
}
2
Arvind Kumar Avinash 9 déc. 2020 à 12:38

Je vous suggère de changer votre code en quelque chose comme ceci:

String text=textFields[i][j].getText();
text=(text.trim().length()==0?"-1":text);
if ((Integer) Integer.parseInt(text) != -1) {
  sudokuBoard.set(i, j, text));
 } else {
1
Piaget Hadzizi 9 déc. 2020 à 12:51
65216826