当我已经在方法中抛出错误时,出现未处理的异常错误

时间:2019-05-10 13:26:14

标签: javafx xlsx

我正在尝试为实现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 个答案:

答案 0 :(得分:2)

EventHandler<T>.handle的签名是

void handle​(T event)

由于您的changeScene有一个throws子句,其中包含不是RuntimeException的异常,因此Java编译器确定您的lambda表达式中未处理这些异常。 lambda表达式的结果与以下代码非常相似:

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

在上面的代码中,应该很容易看到handle方法不能正确处理changeScene引发的异常。

您需要在lambda表达式的主体中添加try/catch

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