首先让我说,我不是 Java 程序员,到目前为止还无法理解为什么会这样。
我目前正在做一项家庭作业,要求我使用 JavaFX 创建一个基本的 GUI。此 GUI 的功能要求有按钮,单击时将执行 CRUD 操作。目前,我已在插入方法中正确设置了所有内容:
public void Insert() throws SQLException{
//Insert new record here
}
但是,每当我尝试使用“setOnAction”订阅此方法时,编译器都会告诉我事件中存在未处理的异常:
btnInsert.setOnAction(e ->Insert());
我更好奇是否有一种相对简洁的方式来处理这个问题?到目前为止,我一直无法提出解决方案。
最佳答案
那是因为 Java 要求您声明您抛出的所有已检查异常 - 因此每当您调用可能抛出已检查异常的方法时,您必须捕获它或声明您可以自己抛出它。
参见 this question已检查异常与未检查异常的解释(简短版本 - 任何继承 Error
或 RuntimeException
的异常均未检查,而所有其他异常均已检查。)
当您提供 setOnAction
时使用 lambda,您实际上是在创建 EventHandler<ActionEvent>
的匿名类实现.因为它没有声明它抛出任何异常,所以你的匿名类也没有(事实上 - 它不能)。
所以你有两种解决问题的选择:
捕获并处理异常:
btnInsert.setOnAction(e -> { try { Insert(); } catch (SQLException ex) { // Log error, show error message, etc... Whichever is applicable for your application } });
重新抛出一个未经检查的异常:
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/