Ошибка необработанного исключения, когда я уже выбросил ошибки в методе - PullRequest
1 голос
/ 10 мая 2019

Я пытаюсь установить событие мыши для мыши, выпущенной для кнопки в javafx.Программа прикреплена к файлу Excel, который читает данные кнопки.Когда я использую событие, чтобы дать ему метод, который говорит необработанное исключение ошибок, когда я уже выбросил ошибки в обоих методах.

@FXML
void initRecipes() throws IOException, InvalidFormatException {

    File file = new File("src/main/resources/RecipeList/Recipes.xlsx");
    String path = file.getAbsolutePath();
    ExcelReader list = new ExcelReader(path);

    int i = 10;
    int sheetNo = 0;

        categories.add(cheap);
        categories.add(showstopper);
        categories.add(quick);
        categories.add(breakfast);
        categories.add(deserts);
        categories.add(salads);

        for (HBox h : categories) {
            for (int k = 0; k < list.getAmount(sheetNo); k++) {

                String buttonId = Integer.toString(i) + Integer.toString(k + 1);
                Button button = new Button(list.getName(buttonId, sheetNo));
                button.setId(buttonId);
                button.setStyle("-fx-background-image: url('" + 
                list.getImage(buttonId, sheetNo) + "')");
                button.setPrefHeight(buttonHeight);
                button.setPrefWidth(buttonWidth);

                button.setOnMouseReleased(event -> changeScene(buttonId));
                 //Error occuring here ^^^^^
                h.getChildren().add(button);
            }

            sheetNo++;
            i += 10;

        }
        list.close();
    }

void changeScene(String buttonId) throws IOException, InvalidFormatException {

    File file = new File("src/main/resources/RecipeList/ingredients.xlsx");
    String path = file.getAbsolutePath();

    ExcelReader list = new ExcelReader(path);

    SecondaryPresenter s = new SecondaryPresenter();
    s.initialize();


}

Я совершенно не уверен, является ли это правильным способом установкисобытие и почему он показывает эту ошибку, если я уже выбросил 2 ошибки, которые он говорит, что я не обработал.Кто-нибудь знает, что я делаю не так?Спасибо

1 Ответ

2 голосов
/ 10 мая 2019

Подпись EventHandler<T>.handle равна

void handle​(T event)

Поскольку в вашем changeScene есть предложение throws, содержащее исключения, не являющиеся RuntimeException s, компилятор java определяетчто такого рода исключения не обрабатываются в вашем лямбда-выражении.Лямбда-выражение приводит к результату, очень похожему на следующий код:

button.setOnMouseReleased(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent event) {
        changeScene(buttonId);
    }
});

В приведенном выше коде должно быть легко увидеть, что метод handle не обрабатывает исключения, выдаваемые changeScene правильно.

Вам необходимо добавить try/catch в тело лямбда-выражения:

button.setOnMouseReleased(event -> {
    try {
        changeScene(buttonId);
    } catch (IOException | InvalidFormatException ex) {
        // TODO: exception handling
    }
});
...