Java setOnAction 订阅抛出异常的事件

标签 java events javafx

首先让我说,我不是 Java 程序员,到目前为止还无法理解为什么会这样。

我目前正在做一项家庭作业,要求我使用 JavaFX 创建一个基本的 GUI。此 GUI 的功能要求有按钮,单击时将执行 CRUD 操作。目前,我已在插入方法中正确设置了所有内容:

        public void Insert() throws SQLException{

        //Insert new record here
    }

但是,每当我尝试使用“setOnAction”订阅此方法时,编译器都会告诉我事件中存在未处理的异常:

btnInsert.setOnAction(e ->Insert());

我更好奇是否有一种相对简洁的方式来处理这个问题?到目前为止,我一直无法提出解决方案。

最佳答案

那是因为 Java 要求您声明您抛出的所有已检查异常 - 因此每当您调用可能抛出已检查异常的方法时,您必须捕获它或声明您可以自己抛出它。

参见 this question已检查异常与未检查异常的解释(简短版本 - 任何继承 ErrorRuntimeException 的异常均未检查,而所有其他异常均已检查。)

当您提供 setOnAction 时使用 lambda,您实际上是在创建 EventHandler<ActionEvent> 的匿名类实现.因为它没有声明它抛出任何异常,所以你的匿名类也没有(事实上 - 它不能)。

所以你有两种解决问题的选择:

  1. 捕获并处理异常:

    btnInsert.setOnAction(e -> {
        try {
            Insert();
        } catch (SQLException ex) {
            // Log error, show error message, etc... Whichever is applicable for your application
        }
    });
    
  2. 重新抛出一个未经检查的异常:

    btnInsert.setOnAction(e -> {
        try {
            Insert();
        } catch (SQLException ex) {
            throw new RuntimeException(ex); // Or any other subclass of RuntimeException or Error
        }
    });
    

关于在两个选项之间进行选择 - Oracle's documentation是这样说的:

Here's the bottom line guideline: If a client can reasonably be expected to recover from an exception, make it a checked exception. If a client cannot do anything to recover from the exception, make it an unchecked exception.

当然,这一切都可以从实际的 EventHandler 中移开,因此可以在无检查异常的方法上调用它。

关于Java setOnAction 订阅抛出异常的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38626174/

相关文章:

java - 任务取消方法或事件

JavaFX、折线图符号和 CSS

.net - WPF:MessageBox 是否会破坏 PreviewMouseDown?

javascript - 使用 jQuery 获取集合中被点击元素的索引

c# - 如何捕获事件处理程序的返回值?

JavaFX 2.2 Controller 在 JAR 文件中加载时未调用initialize()

java - HDFS是否将不可拆分文件存储在一个数据节点中?

java - 数组的匿名子类?我认为?不明白这个语法

java - 第一次点击后禁用按钮

Java:如何与机器通信?