Java setOnAction订阅引发异常的事件
问题描述:
让我先说这个,我说,我不是Java程序员,并且迄今一直无法理解为什么会出现这种情况。Java setOnAction订阅引发异常的事件
我目前正在做一个家庭作业,需要我使用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 } });
至于choosin这两个选项克之间 - Oracle's documentation这样说:
这里的底线准则:如果客户可以合理预期从异常中恢复,使它成为一个检查异常。如果客户端无法做任何事情来恢复异常,请将其设为未检查的异常。
当然,这可能全部从实际的EventHandler
移开,因此可以在没有检查异常的方法上调用它。
谢谢。这正是我正在寻找的那种答案。 –