Java setOnAction订阅引发异常的事件
让我先说一句,我不是Java程序员,到目前为止还无法理解为什么会出现这种情况 我目前正在做一项家庭作业,要求我使用JavaFX创建一个基本的GUI。此GUI的功能要求在单击时有执行CRUD操作的按钮。目前,我已在插入方法中正确设置了所有内容:Java setOnAction订阅引发异常的事件,java,events,javafx,Java,Events,Javafx,让我先说一句,我不是Java程序员,到目前为止还无法理解为什么会出现这种情况 我目前正在做一项家庭作业,要求我使用JavaFX创建一个基本的GUI。此GUI的功能要求在单击时有执行CRUD操作的按钮。目前,我已在插入方法中正确设置了所有内容: public void Insert() throws SQLException{ //Insert new record here } 但是,每当我尝试使用“setOnAction”订阅此方法时,编译器都会告诉
public void Insert() throws SQLException{
//Insert new record here
}
但是,每当我尝试使用“setOnAction”订阅此方法时,编译器都会告诉我事件上存在未处理的异常:
btnInsert.setOnAction(e ->Insert());
我更好奇的是,是否有一种相对简洁的方式来处理这个问题?到目前为止,我还无法想出一个解决方案。这是因为Java要求您声明您抛出的所有已检查异常-因此,每当您调用可能抛出已检查异常的方法时,您必须捕获它或声明您可以自己抛出它 有关选中与未选中异常的解释,请参阅短版本-继承错误或RuntimeException的任何异常均未选中,而所有其他异常均已选中 使用lambda提供setOnAction时,实际上是在创建的匿名类实现。因为它没有声明抛出任何异常,所以匿名类也没有,事实上,它不能 因此,您有两种解决问题的方法: 捕获并处理异常:
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
}
});
重新显示未检查的异常:
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
}
});
关于在这两个选项中进行选择,如下所示:
下面是一条底线指导原则:如果可以合理地期望客户机从异常中恢复,则将其设置为已检查的异常。如果客户端无法从异常中恢复,请将其设置为未检查的异常
当然,这一切都可以从实际的EventHandler中移开,因此可以在检查为无异常的方法上调用它 这是因为Java要求您声明抛出的所有已检查异常——因此,每当您调用可能抛出已检查异常的方法时,您必须捕获它或声明您可以自己抛出它 有关选中与未选中异常的解释,请参阅短版本-继承错误或RuntimeException的任何异常均未选中,而所有其他异常均已选中 使用lambda提供setOnAction时,实际上是在创建的匿名类实现。因为它没有声明抛出任何异常,所以匿名类也没有,事实上,它不能 因此,您有两种解决问题的方法: 捕获并处理异常:
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
}
});
重新显示未检查的异常:
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
}
});
关于在这两个选项中进行选择,如下所示:
下面是一条底线指导原则:如果可以合理地期望客户机从异常中恢复,则将其设置为已检查的异常。如果客户端无法从异常中恢复,请将其设置为未检查的异常
当然,这一切都可以从实际的EventHandler中移开,因此可以在检查为无异常的方法上调用它 多谢各位。这正是我想要的答案。谢谢。这正是我想要的答案。